相关疑难解决方法(0)

什么是unsigned char?

在C/C++中,unsigned char用于什么?它与常规有什么不同char

c c++ char

456
推荐指数
13
解决办法
55万
查看次数

严格的别名规则和'char*'指针

什么是严格别名规则的接受答案提到您可以使用char *别名而不是其他方式.

这对我来说没有意义 - 如果我们有两个指针,一个是指向同一个位置的类型char *,另一个struct something *指向同一个位置,那么第一个别名可能是第二个但第二个不是第一个别名吗?

c c++ strict-aliasing

20
推荐指数
2
解决办法
4115
查看次数

再一次:严格的别名规则和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++严格别名.

本文通过几种方式将两个交换32位整数的两半进行交换,给出了良好的示例和违反严格别名规则的示例.但是,我无法理解其中一个例子.

此代码被描述为已损坏.

uint32_t
swaphalves(uint32_t a)
{
    a = (a >> 16) | (a << 16);
    return a;
}
Run Code Online (Sandbox Code Playgroud)

给出的理由是:

这个版本看起来很合理,但你不知道|的左右两侧 将各自获得原始版本,a或者如果其中一个将获得另一个的结果.这里没有序列点,因此我们对此处的操作顺序一无所知,并且您可能会使用不同级别的优化从同一编译器获得不同的结果.

我不同意.这段代码对我来说很好看.a在该a = (a >> 16 | (a << 16);行中只有一个写入,我希望a在写入之前进行两次读取.此外,没有指针或引用,也没有不兼容的类型.

我在此代码中是否缺少严格的别名冲突,或者文章是否不正确?

c c++ strict-aliasing

11
推荐指数
1
解决办法
204
查看次数

将结构转换为数组

这是一个严格的别名问题,因为编译器会因此引起任何优化顺序问题。

假设我float在一个中有三个public struct XMFLOAT3(与这个不同)。我想强制转换成一个float*。这会使我陷入优化麻烦吗?

XMFLOAT3 foo = {1.0f, 2.0f, 3.0f};
auto bar = &foo.x;

bar[2] += 5.0f;
foo.z += 5.0f;
cout << foo.z;
Run Code Online (Sandbox Code Playgroud)

我认为这将始终打印“ 13”。但是这段代码呢:

XMFLOAT3 foo = {1.0f, 2.0f, 3.0f};
auto bar = reinterpret_cast<float*>(&foo);

bar[2] += 5.0f;
foo.z += 5.0f;
cout << foo.z;
Run Code Online (Sandbox Code Playgroud)

我认为这是合法的,因为根据http://en.cppreference.com/w/cpp/language/reinterpret_cast#Type_aliasing

T2是聚合类型或联合类型,其将上述类型之一作为元素或非静态成员(递归地包括子聚合的元素和所包含的联合的非静态数据成员):这样可以安全地进行强制转换从结构的第一个成员到联合的元素,再到包含它的结构/联合。

我对此的理解正确吗?

显然,这将成为依赖的声明的实现XMFLOAT3

c++ arrays alias struct reinterpret-cast

2
推荐指数
1
解决办法
1235
查看次数

标签 统计

c++ ×5

c ×4

strict-aliasing ×3

reinterpret-cast ×2

alias ×1

arrays ×1

char ×1

struct ×1