相关疑难解决方法(0)

什么是严格别名规则?

当询问C中常见的未定义行为时,灵魂比我提到的严格别名规则更加开明.
他们在说什么?

c strict-aliasing undefined-behavior type-punning

778
推荐指数
10
解决办法
19万
查看次数

再一次:严格的别名规则和char*

我读的越多,我就越困惑.

相关问题的最后一个问题与我的问题最接近,但是我对所有关于对象生命周期的问题感到困惑,尤其是 - 只读或不读.


直截了当.如我错了请纠正我.

这很好,gcc没有发出警告,我正试图" 通过" 读取类型T(uint32_t)char*:

uint32_t num = 0x01020304;
char* buff = reinterpret_cast< char* >( &num );
Run Code Online (Sandbox Code Playgroud)

但这是"坏"(也是一个警告),我正在尝试"反过来":

char buff[ 4 ] = { 0x1, 0x2, 0x3, 0x4 };
uint32_t num = *reinterpret_cast< uint32_t* >( buff );
Run Code Online (Sandbox Code Playgroud)

第二个如何与第一个不同,特别是当我们谈论重新排序指令(用于优化)时?另外,添加const不会以任何方式改变这种情况.

或者这只是一条直接规则,它明确指出:"这可以在一个方向完成,但在另一个方向不能完成"?我在标准中找不到任何相关内容(特别是在C++ 11标准中搜索过).

C和C++是否相同(因为我读了一条评论,暗示它与2种语言不同)?


我曾经union"解决"这个问题,但仍然看起来并非 100%正常,因为标准无法保证(这表明我只能依赖于最后一次修改的值union).

所以,经过大量阅读,我现在更加困惑.我想只是memcpy"好"的解决方案?


相关问题:


编辑
现实世界的情况:我有一个第三方库(http://www.fastcrypto.org/),它计算UMAC并返回值char[ 4 ].然后我需要将其转换为uint32_t.而且,顺便说一句,lib使用的东西((UINT32 …

c c++ strict-aliasing reinterpret-cast

13
推荐指数
1
解决办法
812
查看次数

哪里可以找到跨不同平台/编译器的C++内存对齐文档?

我正在寻找一个关于C++内存对齐的好(全面)文档,典型方法,编译器之间的差异以及常见的陷阱.只是为了检查我对这个主题的理解是否正确并学习新的东西.

这个问题的灵感来自于我使用以下构造的另一个问题的答案:

char const buf[1000] = ...;
unsigned int i = *reinterpret_cast<unsigned int*>(buf + shift); // shift can be anything
Run Code Online (Sandbox Code Playgroud)

它被批评为不符合内存对齐规则.你可以解释为什么这种方法从内存对齐的角度来看是有缺陷的?一个不起作用的例子将受到高度赞赏.我知道这通常是一种糟糕的方法,但我经常在网络协议实现中使用它,所以它比理论问题更实际.

另外请不要在这里提到严格别名,这是另一个问题.

c++ memory-alignment

9
推荐指数
2
解决办法
423
查看次数

reinterpret_cast/static_cast和未定义的行为

在一个变体类中,我正在处理原始存储是一个char数组:

alignas(/* the strictest alignment of all types of the variant */)
char storage[/* ... */];
Run Code Online (Sandbox Code Playgroud)

赋值运算符类似于:

template<class X>
void operator=(const X &x)
{
  // ...code for clearing the storage and setting the tag for type X...

  new(storage) X(x);
}
Run Code Online (Sandbox Code Playgroud)

获取存储对象的代码是:

template<class X>
const X &get()
{
  // ...
  return *reinterpret_cast<X *>(storage);
  // ...
}
Run Code Online (Sandbox Code Playgroud)

它似乎工作,但它总是很好定义?我担心安全地解除引用指针(类型别名规则允许它吗?).

当前的实施和之间是否存在任何差异

 return *static_cast<const X *>(static_cast<const void *>(storage));
Run Code Online (Sandbox Code Playgroud)

相关问题/答案:

/sf/answers/512527081/(见James Kanze的评论).


编辑

第二个问题已经有了答案:C++我们什么时候应该优先使用两个链式的static_cast而不是reinterpret_cast

c++ variant static-cast reinterpret-cast c++11

7
推荐指数
1
解决办法
858
查看次数