【问题标题】:What is the size limit for a class?班级的人数限制是多少?
【发布时间】:2023-03-05 03:53:01
【问题描述】:

我想知道一个类的大小限制是多少。我做了一个简单的测试:

#define CLS(name,other) \
class name\
{\
public: \
name() {};\
   other a;\
   other b;\
   other c;\
   other d;\
   other e;\
   other f;\
   other g;\
   other h;\
   other i;\
   other j;\
   other k;\
};

class A{
   int k;
public:
   A(){};
};

CLS(B,A);
CLS(C,B);
CLS(D,C);
CLS(E,D);
CLS(F,E);
CLS(G,F);
CLS(H,G);
CLS(I,H);
CLS(J,I);

编译失败

"'J' : 类太大"

如果我删除最后的声明 - CLS(J,I);,一切都会正常编译。

这是编译器强加的限制,还是标准中的某个地方?

【问题讨论】:

  • 使用最后一个定义,J 类大约达到 10 GB(取决于填充)。
  • 我只是声明它,并没有实际使用它。我敢打赌声明一些 H 类的数组会破坏运行时:)

标签: c++ oop class


【解决方案1】:

我确定它依赖于编译器。如果您好奇,您可以在仅预处理模式下运行编译器以查看生成的输出是什么。您可能还想查看模板扩展而不是宏。

【讨论】:

  • 这只是一个纯理论问题,这就是我使用宏的原因。为什么我需要模板?此外,如果它是特定于编译器的,则必须在标准中提及最低限制。这就是我一直在寻找的答案。
【解决方案2】:

在 C++11 中,这是附录 B。实现可以施加限制,但至少应该是:

  • 对象的大小 [262 144]。
  • 单个类中的数据成员 [16 384]。
  • 在单个类中声明的成员 [4 096]。

第三个与您使用的构造类型没有直接关系,我之所以提到它只是因为它表明第二个确实是 total 成员,大概包括基础中的那些我不确定会员的情况。但这不仅仅是关于单个类定义中列出的成员。

您的实现似乎放弃了 2^31 个数据成员,或者大小为 2^32,因为它接受 I 但不接受 J。编译器拒绝考虑大小大于SIZE_MAX 的类显然是合理的,即使程序碰巧没有实例化它或在类型上使用sizeof。因此,即使编译器尽最大努力,我也不会期望它可以在 32 位实现上工作。

请注意,“这些数量只是指导方针,并不能确定合规性”,因此,即使它有足够的资源来编译使用更大数字的程序,合规暗示也可以施加任意更小的限制。一致性没有最低限度。

由于资源限制非常小,在 C++ 标准中有很多机会使符合标准的实现变得无用,所以如果这是另一个,也不会造成额外的伤害。

C++03 大致相同:

  • 对象的大小 [262 144]。
  • 单个类、结构或联合中的数据成员 [16 384]。
  • 在单个类中声明的成员 [4 096]。

【讨论】:

  • @Steve Jessop。请注意,附件 B 不是标准的——那里给出的值是推荐的最小值,事实上,如果 16 位系统支持大小超过 65565 的类,我会感到非常惊讶。
  • @James:是的,我已经注意到了。关于 16 位的好点,您希望 SIZE_MAX 小于建议的限制。
【解决方案3】:

我想提一下另一个提到班级大小限制的地方,那就是section 1.2 of the Itanium C++ ABI draft

此 ABI 指定的各种表示形式对 符合用户程序。其中包括,对于 64 位 Itanium ABI:

非虚拟基础子对象在完整对象中的偏移量 包含它必须可以用 56 位有符号整数表示(由于 RTTI 实施)。这意味着 2**55 字节的实际限制 类的大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 2014-05-22
    • 1970-01-01
    • 2021-05-28
    • 2018-05-20
    • 2023-03-25
    • 2022-11-17
    • 2012-07-01
    相关资源
    最近更新 更多