2011-12-15 96 views
9

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

#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);,它所有编译都很好。

这是一个编译器施加的限制,还是在标准的某处?

+0

随着最后一次定义,你会达到约10 GB(取决于填充)的J类。 – dalle 2011-12-15 13:00:33

+0

我只是宣布它,而不是实际使用它。我敢打赌,宣布一些H类的数组会破坏运行时:) – 2011-12-15 13:02:47

回答

14

在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]。
0

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

+0

这只是一个纯粹的理论问题,这就是为什么我使用宏。为什么我需要模板?另外,如果它是编译器特定的,则必须提及标准中的最小限制。这是我正在寻找的那种答案。 – 2011-12-15 12:57:00