加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:37:33 所属栏目:百科 来源:网络整理
导读:我知道类之外的常量变量可以直接优化到编译器的函数调用中,但编译器对常量类变量执行相同操作是否合法? 如果有一个类声明如下: class A {public:const int constVar; //other,modifiable variablesA(int val): constVar(val) { //code to initialize modif
我知道类之外的常量变量可以直接优化到编译器的函数调用中,但编译器对常量类变量执行相同操作是否合法?

如果有一个类声明如下:

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

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

}
};

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

A obj(-2);
int absoluteVal = std::abs(A.constVar);

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

A obj();
int absoluteVal = std::abs(-2);

解决方法

编译器可以自由地发出任何保留程序“可观察行为”的代码(复制构造函数有一个例外,即使它有可观察的行为也可以省略,但这里不适用).这被称为 as if rule

struct X { int x; };

auto foo()
{
  X x{24};

  return x.x;
}

任何体面的编译器都会优化以上内容:

foo():                                # @foo()
        mov     eax,24
        ret

正如你所看到的,它与constness(好吧,差不多)没有任何关系,只是与可观察的行为有关.您可以尝试使用代码添加复杂性,并了解编译器在确定它可以删除与类实例相关的代码时有多聪明.提示:它很聪明.

我不清楚你的意思是:

is the compiler allowed to do this instead and make the class be
sizeof(int) smaller?:

我可以告诉你:对于类型X和类型sizeof(x)的对象x总是= sizeof(X),无论类的实例化如何.换句话说,类的大小是在定义类时确定的,因此它不受可能的实例化或缺乏的影响.类的大小是其非静态数据成员的所有大小加上填充的总和.填充是实现定义的,并且通常可以在某种程度上受到控制(例如,打包的结构).所以不,类的大小永远不会小于所有非静态非引用数据成员的大小总和.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读