我已经检查了所有主要的编译器,sizeof(std::tuple<int, char, int, char>)所有这些都是16。大概它们只是将元素按顺序放入元组,因此由于对齐而浪费了一些空间。
如果元组在内部像这样存储元素:int, int, char, char,则其sizeof可能为12。
实现有可能执行此操作,还是该标准中的某些规则禁止这样做?
我知道为什么GCC默认不重新排序结构的成员,但我很少编写依赖于结构顺序的代码,所以有什么方法可以标记我的结构自动重新排序?
C++编译器(特别是g ++)可以重新排序结构的内部元素吗?
我看到一些奇怪的行为,我有一个包含如下内容的结构:
Struct SomeStruct{
...
...
long someLong;
long someLongArray[25];
unsigned long someUnsignedLong;
unsigned long someUnsignedLongArray[8];
unsigned long int someUnsignedLongInt;
...
...
};
Run Code Online (Sandbox Code Playgroud)
当我写输出这个到文件,顺序someUnsignedLongArray和someLongArray似乎被反转(即,在元件someLongArray []出现之后someUnsignedLong和的元素someUnsignedLongArray []后出现someLong).这可能吗??
谢谢
更新:根据要求,我使用以下内容写出结构:
int fd = open(fspec,O_RDWR|O_CREAT|O_TRUNC,0666);
int writeRes = write(fd,(char *)&someStruct,sizeof(SomeStruct));
Run Code Online (Sandbox Code Playgroud)
为了完整性,这里是完整的结构:
struct SomeStruct{
byte someByte;
byte someByteArray[6];
char someChar;
char someCharArray[5];
char someCharArrayArray[3][5];
short someShort;
signed short someShortArray[2];
unsigned short someUnsignedShort;
unsigned short someUnsignedShortArray[8];
int someInt;
int someIntArray[3];
int someIntArrayArrayArrayArray[4][3][2][6]; …Run Code Online (Sandbox Code Playgroud) 有没有一种方法可以在类似C的结构中执行自动字段重新排序?我的意思是使用语言功能(例如C和C ++的预处理器以及C ++的模板/类型特征/ etc),这使得可以执行以下宏(类似于Boost.Fusion的样式来适应结构):
REARRANGE(StructureName,
(int8_t)(FieldName1),
(int32_t)(FieldName2),
(int16_t)(FieldName3),
(int32_t)(FieldName4));
// is equivalent to (without loss of generality):
struct StructureName
{
int32_t FieldName2;
int32_t FieldName4;
int16_t FieldName3;
int8_t FieldName1;
};
Run Code Online (Sandbox Code Playgroud)
当然,方法应考虑字段的alignof值(以及sizeof),并在可能的情况下考虑#pragma pack当前值。
我知道结果的可移植性很差,但这仅用于本地使用。
必须将字段名称以及相应的类型保存在一起。
目的是减小总结构尺寸。
寻找一种以 C 结构作为输入并输出尺寸最小的结构的工具。
例如,给定一个只有 3 个成员的初始结构。
struct Book {
char title[50];
char author[25];
int book_id;
};
Run Code Online (Sandbox Code Playgroud)
有6种排列
struct Book1 {
char title[50];
char author[25];
int book_id;
};
struct Book2 {
char title[50];
int book_id;
char author[25];
};
struct Book3 {
char author[25];
char title[50];
int book_id;
};
struct Book4 {
char author[25];
int book_id;
char title[50];
};
struct Book5 {
int book_id;
char author[25];
char title[50];
};
struct Book6 {
int book_id;
char title[50];
char author[25];
};
Run Code Online (Sandbox Code Playgroud)
输出显示 80 …