相关疑难解决方法(0)

当编译时已知的引用占用结构中的空间时,是否错过了优化?

请参阅以下示例:

struct Foo {
    int a;
    int &b = a;
};
Run Code Online (Sandbox Code Playgroud)

如果错过了优化sizeof(Foo)!=sizeof(int)吗?

我的意思是,编译器可以b从其始终引用的结构中删除它a吗?

有什么阻止编译器进行这种转换的吗?

(请注意,struct Foo看起来是这样。没有构造函数,等等。但是您可以在周围添加任何内容Foo,这表明该优化将违反标准。)

c++ struct initialization reference language-lawyer

27
推荐指数
1
解决办法
1093
查看次数

添加到"char*"指针UB,当它实际上没有指向char数组?

C++ 17(expr.add/4)说:

当向指针添加或从指针中减去具有整数类型的表达式时,结果具有指针操作数的类型.如果表达式P指向具有n个元素的数组对象x的元素x [i],则表达式P + J和J + P(其中J具有值j)指向(可能是假设的)元素x [i + j]如果0≤i+j≤n; 否则,行为未定义.同样地,如果0≤i-j≤n,则表达式P-J指向(可能是假设的)元素x [i-j]; 否则,行为未定义.

struct Foo {
    float x, y, z;
};

Foo f;
char *p = reinterpret_cast<char*>(&f) + offsetof(Foo, z); // (*)
*reinterpret_cast<float*>(p) = 42.0f;
Run Code Online (Sandbox Code Playgroud)

该行标有(*)UB?reinterpret_cast<char*>(&f)不指向char数组,而是指向浮点数,因此根据引用的段落它应该是UB.但是,如果它是UB,那么它offsetof的用处将是有限的.

是UB吗?如果没有,为什么不呢?

c++ language-lawyer

12
推荐指数
3
解决办法
392
查看次数

C++可以通过编译器在类外优化常量类数据吗?

我知道类之外的常量变量可以直接优化到编译器的函数调用中,但编译器对常量类变量执行相同操作是否合法?

如果有一个类声明如下:

class A {
public:
const int constVar;
    //other, modifiable variables

A(int val): constVar(val) {
         //code to initialize modifiable variables

}
};
Run Code Online (Sandbox Code Playgroud)

我创建一个A的实例并调用这样的函数:

A obj(-2);
int absoluteVal = std::abs(A.constVar);
Run Code Online (Sandbox Code Playgroud)

是否允许编译器执行此操作并使类sizeof(int)更小?:

A obj();
int absoluteVal = std::abs(-2);
Run Code Online (Sandbox Code Playgroud)

c++ memory-layout compiler-optimization object-layout

3
推荐指数
1
解决办法
393
查看次数