我正在我的代码库中寻找
std::bit_cast
的合法用例。然而,当前的 cppreference 文档 让我想知道它是否可能通过创建(命名的)临时对象(因此不受强制复制/移动省略)带来开销。
查看标准,它还说它返回一个必须复制的普通对象。
真的有开销吗?相对于现有对象的单纯
std::memcpy
的增益是多少?
作为说明,这里有一个人为的示例,其中,ASFAIU,
std::bit_cast
似乎意味着比std::memcpy
更多的组装(不是最好的指标,但我找不到最简单的方法来说明我的问题) :
//header.h
#ifndef HEADER
#define HEADER
#include <array>
class S {
public:
int val[1024] = {-1};
};
void SetBC(S& s,const std::array<char,sizeof(S)>& arr);
void SetMC(S& s,const std::array<char,sizeof(S)>& arr);
#endif
// main.cpp
#include "header.h"
#include <bit>
#include <cstring>
void SetBC(S& s,const std::array<char,sizeof(S)>& arr)
{
s = std::bit_cast<S>(arr);
}
void SetMC(S& s,const std::array<char,sizeof(S)>& arr)
{
std::memcpy(&s,arr.data(),sizeof(S));
}
作为说明,这里是一个人为的示例,其中 ASFAIU,std::bit_cast 似乎意味着比 std::memcpy 更多的汇编(不是最好的指标,但我找不到最简单的方法来说明我的问题) :
函数
SetBC
和 SetMC
可以编译为相同的程序集。如果编译器没有这样做,那么它就是编译器中的一个错误(在错过优化的意义上)。
查看标准,它还说它返回一个必须复制的普通对象。
按值返回对象比 memcpy
更有
好处。它允许使用结果来初始化变量或在
return
语句中返回它,以便应用强制复制省略,并且无需在将预期值存储在中之前首先使用某种临时状态定义和初始化目标类型的变量它。
因为您在示例函数中使用了外参数,所以您再次失去了这种好处。如果您尝试将函数重写为按值返回,您会发现
std::bit_cast
版本会更好。
此外,
std::bit_cast
是类型安全的,可以在编译时使用。两者都比memcpy
有更多好处。