课程的大小限制是多少?

时间:2011-12-15 12:53:03

标签: c++ oop class

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

#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);,那么一切都很好。

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

3 个答案:

答案 0 :(得分:15)

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

  • 物体的大小[262 144]。
  • 单个班级的数据成员[16 384]。
  • 成员在一个班级[4 096]中宣布。

第三个与你正在使用的建筑类型没有直接关系,我提到它只是因为它表明第二个确实是成员,可能包括那些在基地我不确定会员。但这不仅仅是关于单个类定义中列出的成员。

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

请注意,“这些数量只是指导原则而不是确定合规性”,因此即使在有足够资源编译使用较大数字的程序的情况下,符合条件的含义也可以施加任意较小的限制。一致性没有最低限制。

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

C ++ 03或多或少相同:

  • 物体的大小[262 144]。
  • 单个类,结构或联合中的数据成员[16 384]。
  • 成员在一个班级[4 096]中宣布。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我想提到另一个提到班级人数限制的地方,位于section 1.2 of the Itanium C++ ABI draft

  

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

     

非虚拟基础子对象在整个对象中的偏移量   包含它必须由一个56位带符号整数表示(由于   RTTI实施)。这意味着实际限制为2 ** 55字节   一个班级的规模。