班级的大小限制是多少?

What is the size limit for a class?

提问人:Luchian Grigore 提问时间:12/15/2011 最后编辑:Luchian Grigore 更新时间:1/15/2019 访问量:4292

问:

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

#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);

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

C++ OOP

评论

0赞 dalle 12/15/2011
使用最后一个定义,J 类的容量约为 10 GB(取决于填充)。
0赞 Luchian Grigore 12/15/2011
我只是在声明它,而不是实际使用它。我敢打赌,声明一些 H 类的数组会破坏运行时:)
0赞 ecatmur 10/7/2020
stackoverflow.com/questions/7724790/ 的可能重复...

答:

0赞 BillRobertson42 12/15/2011 #1

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

评论

0赞 Luchian Grigore 12/15/2011
这只是一个纯粹的理论问题,这就是我使用宏的原因。为什么我需要模板?此外,如果它是特定于编译器的,则必须在标准中提及最低限制。这就是我一直在寻找的答案。
15赞 Steve Jessop 12/15/2011 #2

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

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

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

您的实现似乎放弃了 2^31 个数据成员,或者放弃了 2^32 个数据成员,因为它接受但不接受 .对于编译器来说,拒绝考虑大小大于 的类是相当合理的,即使程序碰巧没有实例化它或在类型上使用它。因此,即使编译器尽了最大的努力,我也永远不会期望这在 32 位实现上有效。IJSIZE_MAXsizeof

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

在 C++ 标准中,由于资源限制小得离谱,符合的实现有各种机会变得毫无用处,因此如果这是另一个,则不会造成额外的伤害。

C++03 或多或少是相同的:

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

评论

0赞 James Kanze 12/15/2011
@Steve杰索普。请注意,附录 B 不是规范性的---那里给出的值是建议的最小值,事实上,如果 16 位系统支持大小超过 65565 的类,我会感到非常惊讶。
0赞 Steve Jessop 12/15/2011
@James:是的,我已经注意到了。关于 16 位的好点,您希望小于建议的限制。SIZE_MAX
1赞 aplewis 1/15/2019 #3

我想提一下另一个提到类大小限制的地方,即 Itanium C++ ABI 草案的第 1.2 节

本 ABI 规定的各种表述对 符合用户程序。对于 64 位 Itanium ABI,其中包括:

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