我在想一堂课的大小限制是多少。我做了一个简单的测试:
#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);,它都编译得很好。
这是编译器强加的限制,还是在标准的某个地方?
发布于 2011-12-15 12:57:56
在C++11中,这是附件B。实现可以施加限制,但至少应该是:
第三个与你使用的建筑没有直接关系,我提到它只是因为它表明第二个成员确实是全体成员,大概包括那些在基地的成员,我不确定成员中的成员。但这不仅仅是一个类定义中列出的成员的问题。
您的实现似乎放弃了2^31数据成员或大小为2^32的数据成员,因为它接受I,但不接受J。显然,编译器拒绝考虑大小大于SIZE_MAX的类是相当合理的,即使程序碰巧没有实例化它或在类型上使用sizeof。因此,即使编译器尽了最大的努力,我也不会指望它能在32位实现上工作。
请注意,“这些数量只是指南,不能确定遵从性”,因此,即使有足够的资源来编译使用较大数字的程序,一致性含义也可以施加任意较小的限制。没有最低限度的一致性。
在C++标准中,由于资源限制太小,一致性实现是无用的,因此如果这是另一种情况,则不会造成额外的伤害。
C++03或多或少是一样的:
发布于 2019-01-15 04:35:33
我想提到另一个提到类大小限制的地方,在Itanium C++ ABI草案第1.2节中。
此ABI指定的各种表示对符合的用户程序施加了限制。其中包括64位Itanium ABI: 包含它的完整对象中的非虚拟基子对象的偏移量必须由一个56位有符号整数表示(由于RTTI实现)。这意味着对类大小的实际限制为2**55字节。
发布于 2011-12-15 12:55:35
我确信它的编译器依赖于。您可以只在预处理模式下运行编译器,以查看生成的输出(如果您有兴趣的话)。您还可能希望查看模板展开,而不是宏。
https://stackoverflow.com/questions/8520421
复制相似问题