我有一个C ++类,它有四个私有浮点数和一堆非静态公共函数来处理这些数据。
它是否有保证,或者可能是这样,四个浮点数是连续的,没有填充。这将使该类的大小为四个浮点数,并且它的地址将是第一个浮点数的地址。
答案 0 :(得分:9)
C ++标准保证数组连续存储,没有中间填充。如果你想确保浮点数是连续的,并且你不想依赖编译器特定的填充指令,你可以简单地将浮点数存储在一个数组中:
private:
float array_[4];
但是,这并不能保证该类的大小将是四个浮点数。但是你可以确保任何专门处理内部浮动数组的操作都将在一个连续的数组上运行。
但更一般地说,也许你应该质疑为什么需要这种保证。通常,您关心类的内存布局的唯一原因是您是否将其视为序列化字节数组。在这种情况下,通常最好创建专用的序列化/反序列化功能,而不是依赖于任何特定的内存布局。
答案 1 :(得分:8)
这取决于你的编译器。
您可以使用#pragma pack(1)
MSVC和gcc,或#pragma pack 1
aCC。
例如,假设MSVC
/ gcc
:
#pragma pack(1)
class FourFloats
{
float f1, f2, f3, f4;
};
或更好:
#pragma pack(push, 1)
class FourFloats
{
float f1, f2, f3, f4;
};
#pragma pack(pop)
这基本上禁用了填充并保证floats
是连续的。但是,为了确保您的班级实际上是4 * sizeof(float)
,它必须没有vtbl,这意味着virtual members是禁止的。
答案 2 :(得分:3)