Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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++_Class_Struct_Padding - Fatal编程技术网

C++ 同一类型的类成员之间的填充是否始终相同?

C++ 同一类型的类成员之间的填充是否始终相同?,c++,class,struct,padding,C++,Class,Struct,Padding,以下类包含一些相同类型的成员: template <typename T> class MyClass { T m0; T m1; T m2; T m3; T m4; //... }; 或者编译器是否允许使用任意多于所需的填充(无论出于何种原因…)?例如:如果sizeof(T)==4且alignof(T)==8,编译器将在成员之间使用4个填充字节。仅在m2和m3之间使用12个填充字节是否有效 当MyClass具有虚拟函数或虚拟基类时会

以下类包含一些相同类型的成员:

template <typename T>
class MyClass
{
    T m0;
    T m1;
    T m2;
    T m3;
    T m4;
    //...
};
或者编译器是否允许使用任意多于所需的填充(无论出于何种原因…)?例如:如果sizeof(T)==4且alignof(T)==8,编译器将在成员之间使用4个填充字节。仅在m2和m3之间使用12个填充字节是否有效

当MyClass具有虚拟函数或虚拟基类时会出现什么情况?编译器真的允许在任意数据成员之间插入与MyClass(如vtable ptr)相关的信息吗?或者上述标准中的句子与T的虚函数和虚基类更相关?因为如果在T之外存储与T相关的信息是有效的,那么它也可以具有以下含义:

template <typename T>
class MyClass
{
    T m0;
    //space to manage virtual functions and base classes of m0
    //padding
    T m1;
    //space to manage virtual functions and base classes of m1
    //padding
    T m2;
    //space to manage virtual functions and base classes of m2
    //...
};
模板
类MyClass
{
tM0;
//用于管理m0的虚拟函数和基类的空间
//填充物
T m1;
//用于管理m1的虚拟函数和基类的空间
//填充物
T m2;
//用于管理m2的虚拟函数和基类的空间
//...
};

什么可能会再次给出一个规则模式。

否。没有规则强制要求它,因此编译器可以在任何地方插入填充。“对齐要求可能…”只是一个示例,而不是对可能原因的限制

如果您有一个
tm[5]
成员,那么情况就不同了,在这种情况下
&(this->m[1])-&(this->m[0])==1


出于同样的原因,“编译器真的允许在任意数据成员之间插入与MyClass(如vtable ptr)相关的信息吗?”必须得到肯定的回答,因为没有规则禁止这样做。它不能插入到子对象的中间(无论是<代码> t>代码>还是<代码> t[5 ] < /代码>,但是子对象之间是很好的。

但是“非结合”的非静态数据成员的意思是什么?在没有插入访问说明符的情况下声明的类被分配,以便以后的成员在类对象中具有更高的地址。“?如果填充是如此任意,那么它有什么意义呢?这句话仅仅意味着编译器不能更改成员的顺序,因此后面的成员不能首先出现在内存中。更准确地说:它将后续成员的相对偏移量限制为严格的正值,但在其他方面未指定值。是的,但为什么?看一看。它是C,不是C++,但它是同一个主题。在C中,可以将<代码>结构> { int;浮点;double;}*//> >为<代码>结构{int,浮点*}//>。如果双元在浮点之前移动,这将是个问题。它还应该在C++中使用POD结构。但我仍然想知道为什么9.2/12的限制适用于所有类,而不仅仅是POD结构。。。
template <typename T>
class MyClass
{
    T m0;
    //space to manage virtual functions and base classes of m0
    //padding
    T m1;
    //space to manage virtual functions and base classes of m1
    //padding
    T m2;
    //space to manage virtual functions and base classes of m2
    //...
};