使用字节拷贝进行转换--bit_cast

本文介绍了C++20中新增的`bit_cast`功能,用于按字节转换数据类型。`bit_cast`在代码分析部分展示了其实现方式,依赖于`std::memcpy`进行字节拷贝,并利用模板和类型检查确保安全。在测试代码中,展示了如何将函数指针转换为长整型并保持地址一致。文章还提及了`std::enable_if_t`、`std::is_trivially_copyable_v`等类型检查工具的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 概述

bit_cast是C++20支持的按字节进行转换的方法,如:

auto a = std::bit_cast<std::array<char, sizeof(p)>>(p);

二 代码分析

1.bit_cast.hpp:

#pragma once
#include <cstring>
#include <type_traits>
template <class To, class From>
typename std::enable_if_t<(sizeof(To) == sizeof(From))
                        && std::is_trivially_copyable_v<From>
                        && std::is_trivially_copyable_v<To>,
                        To> bit_cast(const From &src) {
    static_assert(std::is_trivially_constructible_v<To>, "require constructible.");
    To dst;
    std::memcpy(&dst, &src, sizeof(To));
    return dst;
}

(1)std::memcpy类似C语言的memcpy,需要包含头文件cstring;

(2)std::enable_if_t是C++17支持的条件编译,如果std::enable_if_t<条件,类型>中的条件为true,那么编译器选择设置的类型;

(3)std::is_trivially_copyable_v用来判断某种类型是否可以复制;

(4)std::is_trivially_constructible_v用来判断某种类型是否有缺省构造函数;

(5)static_assert用于编译时判断。

2.测试代码test.cpp:

#include <stdio.h>
#include <iostream>
#include "bit_array.hpp"
void fun() {
    std::cout << "I am fun." << std::endl;
}
int main() {
    long x = bit_cast<long, decltype(&fun)>(fun);
    printf("fun address:0x%0x\n", fun);
    printf("fun address with bit cast:0x%0x\n", x);
 
    decltype(&fun) kk;
    kk = fun;
    kk();   // call fun
 
    return 0;
}

(1)decltype(&fun)用来获取fun函数类型;

(2)通过bit_cast转换后x和fun的地址一致。

(3)kk是fun函数定义的类型,使用kk()就是调用fun函数。

3.编译:

使用C++17编译

g++ -std=c++17 -g -o Test test.cpp -I ./

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值