gpt4 book ai didi

c++ - 为什么 GCC 和 Clang 不做这种别名优化?

转载 作者:IT老高 更新时间:2023-10-28 12:51:55 25 4
gpt4 key购买 nike

I have a case其中一个 friend 将“Base”类型的非基类对象强制转换为“Derived”类类型对象,其中“Derived”是“Base”的派生类,只添加函数,不添加数据。在下面的代码中,我确实添加了一个数据成员 x到派生类

struct A {
int a;
};

struct B : A {
// int x;
int x;
};

A a;

int g(B *b) {
a.a = 10;
b->a++;
return a.a;
}

通过严格的别名分析,GCC(也是 Clang)总是返回 10 , 而不是 11 , 因为 b永远不能指向a在定义明确的代码中。但是,如果我删除 B::x (实际上是我 friend 的代码中的情况),GCC 的输出汇编代码确实没有优化 a.a 的返回访问并从内存中重新加载值。所以我 friend 调用g的代码在 GCC 上“工作”(如他所愿),即使我认为它仍有未定义的行为

g((B*)&a);

所以在本质上相同的两种情况下,GCC 优化了一种情况而没有优化另一种情况。 是因为 b然后可以合法地指向a ?还是因为 GCC 只是不想破坏真实世界的代码?


我测试了陈述的答案

If you remove B::x, then B meets the requirements in 9p7 for a standard-layout class and the access becomes perfectly well-defined because the two types are layout-compatible, 9.2p17.

具有两个布局兼容的枚举

enum A : int { X, Y };
enum B : int { Z };

A a;

int g(B *b) {
a = Y;
*b = Z;
return a;
}

g 的汇编器输出返回 1 ,而不是 0 , 即使 AB布局兼容 (7.2p8)。


所以我的进一步问题是(引用一个答案):“具有完全相同布局的两个类可能被认为是“几乎相同”,它们被排除在优化之外。” 有人可以为 GCC 或 Clang 提供证明吗?

最佳答案

如果去掉B::x,那么B就满足了9p7中对于一个standard-layout类的要求,访问就变得完美了定义良好,因为这两种类型是布局兼容的,9.2p17 并且成员都具有相同的类型。


A standard-layout class is a class that:

  • has no non-static data members of type non-standard-layout class (or array of such types) or reference,
  • has no virtual functions (10.3) and no virtual base classes (10.1),
  • has the same access control (Clause 11) for all non-static data members,
  • has no non-standard-layout base classes,
  • either has no non-static data members in the most derived class and at most one base class with non-static data members, or has no base classes with non-static data members, and
  • has no base classes of the same type as the first non-static data member.

Two standard-layout struct types are layout-compatible if they have the same number of non-static data members and corresponding non-static data members (in declaration order) have layout-compatible types.

关于c++ - 为什么 GCC 和 Clang 不做这种别名优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17193613/

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