相关疑难解决方法(0)

C++中的POD类型是什么?

我有几次遇到这个术语POD型.这是什么意思?

c++ types c++-faq

919
推荐指数
8
解决办法
29万
查看次数

我为什么不#include <bits/stdc ++.h>?

我在我的代码中发布了一个问题,其唯一的#include指令如下:

#include <bits/stdc++.h>
Run Code Online (Sandbox Code Playgroud)

我的老师告诉我这样做,但在评论部分,我被告知我不应该这样做.

为什么?

c++ portability c++-faq turbo-c++ implementation-defined-behavior

215
推荐指数
6
解决办法
2万
查看次数

c ++数据对齐/成员顺序和继承

如果使用继承/多重继承,数据成员如何对齐/排序?这个编译器是否具体?

有没有办法在派生类中指定如何对成员(包括基类中的成员)进行排序/对齐?

谢谢!

c++ inheritance alignment

26
推荐指数
1
解决办法
1万
查看次数

为什么C ++中类的大小取决于数据成员的公共/私有状态?

据我所知,C ++中类的大小取决于以下因素:

  1. 所有非静态数据成员的大小。
  2. 数据成员的顺序。
  3. 是否启用字节填充。
  4. 其直接基类的大小。
  5. 虚拟功能的存在。
  6. 继承方式(虚拟继承)。

现在,我创建了两个类,如下所示:

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的大小,请参见

  • A的大小:16
  • B的大小:16

我的假设是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)

现在大小变成

  • A的大小:16
  • B的大小:20

我似乎无法理解这种差异的原因。

c++ memory inheritance

21
推荐指数
2
解决办法
401
查看次数

标准布局和尾部填充

大卫霍尔曼最近在推特上发布了以下示例(我稍微减少了):

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++ g++ language-lawyer standard-layout clang++

20
推荐指数
1
解决办法
595
查看次数