C++ 使用std::copy解决严格的别名问题安全吗?
我有一个函数如下所示:C++ 使用std::copy解决严格的别名问题安全吗?,c++,reinterpret-cast,strict-aliasing,type-punning,C++,Reinterpret Cast,Strict Aliasing,Type Punning,我有一个函数如下所示: template<typename T> void some_function(T* buffer) { BOOST_STATIC_ASSERT(sizeof(T) <= sizeof(unsigned int)); unsigned int temporary_buffer; int result = some_c_api(&temporary_buffer); if(result == error)
template<typename T>
void some_function(T* buffer) {
BOOST_STATIC_ASSERT(sizeof(T) <= sizeof(unsigned int));
unsigned int temporary_buffer;
int result = some_c_api(&temporary_buffer);
if(result == error)
throw some_exception();
// originally *buffer = reinterpret_cast<T&>(temporary_buffer), but this breaks
// strict aliasing
std::copy( reinterpret_cast<char*>(&temporary_buffer),
reinterpret_cast<char*>(&temporary_buffer) + sizeof(T),
reinterpret_cast<char*>(buffer));
}
模板
空一些_函数(T*buffer){
BOOST_STATIC_ASSERT(sizeof(T)这段代码看起来像是一场即将发生的灾难。如果出于某种原因它必须存在,那么应该用静态断言和注释填充它,以明确其意图
基本上,只有满足以下条件,它才会起作用:
sizeof(T)是temporary\u buffer
实际上是一个unsigned int
?你真的在从unsigned int
s地址复制sizeof(T)
字节吗?关于sizeof(T)有什么保证吗是的,它确实是这样的。在函数的开头有一个静态断言,它确保sizeof(T)哎呀,完全错过了断言。所有这些条件都成立(并在实际代码中强制执行)。这就是为丑陋的C API编写包装时的样子。