Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 班级的人数限制是多少?_C++_Oop_Class - Fatal编程技术网

C++ 班级的人数限制是多少?

C++ 班级的人数限制是多少?,c++,oop,class,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{ i

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

#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++11中,这是附录B。实现可以施加限制,但它们至少应该是:

  • 对象的大小[262 144]
  • 单个类中的数据成员[16 384]
  • 在单个类中声明的成员[4096]
第三个与您使用的构造类型没有直接关系,我之所以提到它,是因为它表明第二个确实是所有成员,大概包括那些在base中的成员,我不确定成员的成员。但这不仅仅是单个类定义中列出的成员

您的实现似乎放弃了2^31个数据成员,或者大小为2^32,因为它接受
I
,但不接受
J
。对于编译器来说,拒绝考虑大小大于<代码> sisixMax < /C>的类是非常合理的,即使程序不发生实例化,也不使用类型> <代码> <代码>。因此,即使编译器尽了最大的努力,我也不会期望它在32位实现上工作

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

<> P>在C++标准中有各种机会,由于一个小的资源限制,一致的实现是无用的,所以如果这是另一个,则没有额外的伤害。 C++03大致相同:

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

我想提到另一个提到班级人数限制的地方,那就是

本ABI规定的各种表述对 一致性用户程序。对于64位安腾ABI,其中包括:

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


这只是一个纯粹的理论问题,这就是为什么我使用宏。为什么我需要模板?此外,如果它是特定于编译器的,则必须在标准中提及最低限度。这就是我一直在寻找的答案。在上一次定义中,J类的容量达到了10GB(取决于填充)。我只是声明了它,而不是实际使用它。我打赌声明一些H类的数组会破坏运行时:)可能是@Steve Jessop的重复。请注意,附录B不是规范性的——这里给出的值是推荐的最小值,事实上,如果一个16位系统支持一个大小超过65565的类,我会非常惊讶。@James:是的,我已经注意到了。最好是16位,您希望
SIZE\u MAX
小于建议的限制。