我在我的代码中发布了一个问题,其唯一的#include指令如下:
#include <bits/stdc++.h>
Run Code Online (Sandbox Code Playgroud)
我的老师告诉我这样做,但在评论部分,我被告知我不应该这样做.
为什么?
c++ portability c++-faq turbo-c++ implementation-defined-behavior
如果使用继承/多重继承,数据成员如何对齐/排序?这个编译器是否具体?
有没有办法在派生类中指定如何对成员(包括基类中的成员)进行排序/对齐?
谢谢!
据我所知,C ++中类的大小取决于以下因素:
现在,我创建了两个类,如下所示:
class A{
int a;
short s;
int b;
char d;
};// kept a char at last on purpose to leave a "hole"
class B : public A{
char c;
};
Run Code Online (Sandbox Code Playgroud)
现在检查A和BI的大小,请参见
我的假设是B类中的字符c被容纳在A类中剩余的“空洞”中。
但是,令我感到困惑的是以下情况,其中我将成员公开
class A{
public:
int a;
short d;
int b;
char s;
};
class B : public A{
public:
char c;
};
Run Code Online (Sandbox Code Playgroud)
现在大小变成
我似乎无法理解这种差异的原因。
大卫霍尔曼最近在推特上发布了以下示例(我稍微减少了):
struct FooBeforeBase {
double d;
bool b[4];
};
struct FooBefore : FooBeforeBase {
float value;
};
static_assert(sizeof(FooBefore) > 16);
//----------------------------------------------------
struct FooAfterBase {
protected:
double d;
public:
bool b[4];
};
struct FooAfter : FooAfterBase {
float value;
};
static_assert(sizeof(FooAfter) == 16);
Run Code Online (Sandbox Code Playgroud)
您可以检查godbolt上的clang中的布局,并查看大小更改的原因是,FooBefore成员value放置在偏移16处(保持完全对齐8 FooBeforeBase)而在FooAfter,成员value放置在偏移12处(有效地使用FooAfterBase的尾巴填充).
我很清楚这FooBeforeBase是标准布局,但FooAfterBase不是(因为它的非静态数据成员并不都具有相同的访问控制,[class.prop]/3).但是FooBeforeBase,标准布局需要这方面的填充字节是什么呢?
gcc和clang都重用了FooAfterBase填充,最后用了sizeof(FooAfter) == 16.但是MSVC没有,结果是24.每个标准是否有必要的布局,如果没有,为什么gcc和clang做他们做的事情?
有一些混乱,所以只是为了清理:
FooBeforeBase 是标准布局FooBefore是 …c++ ×5
c++-faq ×2
inheritance ×2
alignment ×1
clang++ ×1
g++ ×1
implementation-defined-behavior ×1
memory ×1
portability ×1
turbo-c++ ×1
types ×1