gpt4 book ai didi

c++ - 执行变量原始拷贝的简单转换是否会破坏严格的别名?

转载 作者:太空狗 更新时间:2023-10-29 21:07:26 25 4
gpt4 key购买 nike

我一直在阅读关于 strict aliasing 的文章 最近很多。 C/C++ 标准规定以下代码无效(未定义的行为是正确的),因为编译器的值可能为 a缓存在某处,并且在我更新 b 时不会识别它需要更新值;

float *a;
...
int *b = reinterpret_cast<int*>(a);
*b = 1;

标准还说 char*可以为任何东西起别名,所以(如果我错了请纠正我)每当对 char* 进行写访问时,编译器将重新加载所有缓存的值变量被创建。因此下面的代码是正确的:

float *a;
...
char *b = reinterpret_cast<char*>(a);
*b = 1;

但是指针根本不涉及的情况呢?例如,我有以下代码,GCC 向我发出关于严格别名的警告。

float a = 2.4;
int32_t b = reinterpret_cast<int&>(a);

我想做的只是复制 a 的原始值,因此不应应用严格的别名。这里可能存在问题,还是只是 GCC 对此过于谨慎?

编辑

我知道有一个使用 memcpy 的解决方案,但它会导致代码的可读性大大降低,因此我不想使用该解决方案。

EDIT2

int32_t b = *reinterpret_cast<int*>(&a);也不起作用。

已解决

这似乎是 a bug in GCC .

最佳答案

如果你想复制一些内存,你可以告诉编译器这样做:

编辑:添加了一个函数以提高代码的可读性:

#include <iostream>
using std::cout; using std::endl;
#include <string.h>

template <class T, class U>
T memcpy(const U& source)
{
T temp;
memcpy(&temp, &source, sizeof(temp));
return temp;
}

int main()
{
float f = 4.2;
cout << "f: " << f << endl;

int i = memcpy<int>(f);
cout << "i: " << i << endl;
}

[Code] [Updated Code]

编辑:正如用户/GMan 在评论中正确指出的那样,一个全功能的实现可以检查 TUPODs .但是,鉴于该函数的名称仍然是 memcpy,您可以依赖您的开发人员将其视为具有与原始 memcpy 相同的约束。这取决于您的组织。此外,使用目标的大小,而不是源的大小。 (谢谢,奥利。)

关于c++ - 执行变量原始拷贝的简单转换是否会破坏严格的别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5059744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com