gpt4 book ai didi

c++ - 变量中内存的简单重叠是否违反了别名规则?

转载 作者:行者123 更新时间:2023-11-30 05:04:38 25 4
gpt4 key购买 nike

为了有效地对编译时大小的数组进行编译时大小的子范围 View 。

我已经使用这种技术一段时间了,因为我从未收到警告或错误,所以我认为它没问题。

std::array<int,3> aa = {{1,2,3}};
std::array<int,2>& ee = reinterpret_cast<std::array<int,2>&>(aa[1]); // subrange {{2,3}}
assert(ee[0] == 2);

直到我找到这些评论 https://stackoverflow.com/a/36046533/225186

我可以制作gcc以此产生警告

int aaa = 5;
double& eee = reinterpret_cast<double&>(aaa);

或者这个

std::array<int,3> aaaa = 5;
std::array<double,2>& eeee = reinterpret_cast<std::array<double,2>&>(aaaa);

...但不是第一 block 代码。

如果两个引用不完全在同一个地址中,似乎不会强制执行别名规则?


似乎每个人都同意这至少是 UB。这样可以吗?或者更糟?

int aa[3] = {1,2,3};
int* ee = new(&aa[1]) int[2];

如果我能说int ee[2] = new(&aa[1]) int[2];就完美了因为 ee 的类型将携带新的大小,我可以递归地使用 subview 。

我可以使用 std::basic_string_view<int> 吗?为了这?在 cppreference 中,唯一的限制是 int必须是 char -喜欢。(我认为是。)

最佳答案

std::array<int,3> aa = {{1,2,3}};
std::array<int,2>& ee = reinterpret_cast<std::array<int,2>&>(aa[1]);

绝对违反了严格的别名规则,访问ee未定义的行为

参见 cppreference/reinterpret_cast/type aliasing :

enter image description here


...but not with the first block of code.

如果您的编译器没有产生警告,这并不意味着一切正常 - 警告不是标准强制要求的。编译器会尽力提供帮助,但他们不会检测所有违反标准的行为。

关于c++ - 变量中内存的简单重叠是否违反了别名规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48786091/

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