仅包含编译时常量的类的大小

时间:2010-07-12 03:42:54

标签: c++ const

如果我有一个只包含编译时常量的类,例如

class A {
    static const int x = 1;
    static const int y = 2;
    static const int z = 3;
};

我相信是这样的,只要不采用常量的地址,它们就可以(将会)在编译时被替换它们使用它们并且不会占用可执行文件中的任何空间(作为常量)也就是说,显然数字本身必须显示出来)。如果是这种情况可以/将该类优化出来吗?并且,如果某些内容继承自class A,但仍然只使用常量并且不使用其地址,这会发生变化吗?

哦,并假设,在非继承版本中,除了作为访问常量的方法之外,该类实际上并未在任何地方使用。

感谢。

4 个答案:

答案 0 :(得分:7)

这些变量是const无关紧要;它们是static,所以它们不会影响班级的大小。

sizeof(A)不能为零,因此如果您创建A的实例,则其大小必须至少为一个字节。但是,将A作为基类并不一定会增加派生类的大小,因为“基类子对象的大小可能为零”(C ++03§1.8/ 5)。

答案 1 :(得分:3)

使用的空间

不,静态const int成员将不会为它们分配任何空间,因为它们被评估为编译时常量。

对于类对象的大小(即sizeof(A)),这是不相关的,除非你创建了A类的实例 - 你明确表示你不是。

改为使用名称空间

也就是说,也许您可​​以使用 namespace 来使您的意图更清晰一些?除非您将它用于模板特征之类的东西,否则您似乎滥用 class 来执行作业命名空间。

答案 2 :(得分:1)

我相信每个类型的sizeof必须至少为1(部分是为了确保该类型的实例在数组中获得不同的地址)。

C ++ 0x草案标准的第5.3.3节规定了这一点:

  

当应用于类时,结果是该类的对象中的字节数,包括在数组中放置该类型的对象所需的任何填充。最派生类的大小应大于零。

它们不应该影响实例的大小(因为它们是静态的)但是它们可能需要存储在可执行文件中,因为您需要能够使用地址 - 对他们的操作员。它们是否可以在不存在的情况下进行优化完全取决于编译器以及它是否可以告诉它们没有被取消引用。在这种特殊情况下,枚举可能是一种更好的工具。

但是,应用程序中的三个整数不太可能导致问题。

答案 3 :(得分:1)

它的大小只是因为这类 的对象需要具有 的大小。 (对于初学者,如果两个这样的对象是另一个对象的成员,如果你形成成员指针,它们会有不同的地址吗?)当这个类用作基类时,它将受益于 为空基类优化 并缩小为0。实际上,这个

#include <iostream>

struct A {};
struct B { char x; };
struct C : public A, public B {};

int main()
{
    std::cout << sizeof(A) << '\n';
    std::cout << sizeof(B) << '\n';
    std::cout << sizeof(C) << '\n';
    return 0;
}

打印

1
1
1

对我而言,AC的大小没有任何贡献,这似乎支持了我A的{​​{1}}大小的解释。