gpt4 book ai didi

c++ - 符合标准的编译器应该能够优化这些指针比较中的哪一个 "always false"?

转载 作者:可可西里 更新时间:2023-11-01 16:20:12 24 4
gpt4 key购买 nike

为了更好地理解指针别名不变量在优化过程中的表现,我 plugged some code into the renowned Compiler Explorer ,我将在这里重复:

#include <cstring>

bool a(int *foo, int *bar) {
(void) *foo, (void) *bar;
return foo == bar;
}

bool b(int *foo, float *bar) {
(void) *foo, (void) *bar;
return foo == reinterpret_cast<int *>(bar);
}

bool c(int *foo, int *bar) {
(void) *foo, (void) *bar;
// It's undefined behavior for memcpyed memory ranges to overlap (i.e. alias)
std::memcpy(foo, bar, sizeof(int));
return foo == bar;
}

bool d(int *__restrict foo, int *__restrict bar) {
(void) *foo, (void) *bar;
return foo == bar;
}

当前版本的 Clang 和 GCC 都不会将这些函数中的任何一个编译为始终返回 false,所以我的问题是,这些函数中的哪些在仍然符合 C++ 标准的同时,可以 是否已编译为始终返回 false?我(非常有限)的理解是 bcd 都应该以这种方式进行优化,但我没有信心(我还认识到 __restrict 不在标准中,但假装它具有在任一编译器下定义的语义)。

更新

我在每个函数的顶部都包含了两个指针的取消引用(这样它们就不能是 nullptr),并使 std::memcpy 调用实际复制int 的一个实例。

更新2

添加了一条注释来解释我对 std::memcpy 的意图。

最佳答案

对于a,这是显而易见的。对于 b 代码实际上是正确的,编译器不能做任何假设。考虑对 b 的调用:

int x[2]{};
b(x,reinterpret_cast<float*>(x+1));

如果您正在访问两个参数的值,编译器可能会做出假设:

bool b(int *foo, float *bar) {
*foo=10; //*foo is an int (or unsigned int)
//and if foo is a member of a union
//*foo is the active member
*bar+0.f; //bar must be a float within its lifetime so it cannot be
//in the same union as *foo
return foo == reinterpret_cast<int *>(bar);//so always false
}

对于 c 我同意你的分析,一个非常聪明的编译器可以优化比较。

对于 d,根据 C 标准 restrict 仅对访问对象的方式有影响,对指针的值没有影响,请参见 N1570 中的 §6.7.3

An object that is accessed through a restrict-qualified pointer has a special association with that pointer. This association, defined in 6.7.3.1 below, requires that all accesses to that object use, directly or indirectly, the value of that particular pointer.

b 的情况下,如果访问了指向的对象,那么智能编译器可以做出假设:

bool d(int *__restrict foo, int *__restrict bar) {
*foo=10;
*bar=12;//So foo and bar point to different objects
return foo == bar;//always false
}

关于c++ - 符合标准的编译器应该能够优化这些指针比较中的哪一个 "always false"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56100836/

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