相关疑难解决方法(0)

std :: tuple sizeof,是否错过了优化?

我已经检查了所有主要的编译器,sizeof(std::tuple<int, char, int, char>)所有这些都是16。大概它们只是将元素按顺序放入元组,因此由于对齐而浪费了一些空间。

如果元组在内部像这样存储元素:int, int, char, char,则其sizeof可能为12。

实现有可能执行此操作,还是该标准中的某些规则禁止这样做?

c++ tuples padding language-lawyer

69
推荐指数
2
解决办法
2765
查看次数

是否有GCC关键字允许结构重新排序?

我知道为什么GCC默认不重新排序结构的成员,但我很少编写依赖于结构顺序的代码,所以有什么方法可以标记我的结构自动重新排序?

c gcc c99 padding memory-alignment

17
推荐指数
2
解决办法
2393
查看次数

C++编译器可以重新排序结构中的元素

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)

当我写输出这个到文件,顺序someUnsignedLongArraysomeLongArray似乎被反转(即,在元件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++ struct element

12
推荐指数
2
解决办法
7798
查看次数

类C结构中自动字段重新排序的方法

有没有一种方法可以在类似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 c++ struct alignment c++14

5
推荐指数
1
解决办法
306
查看次数

有什么工具可以优化 C 中的结构大小吗?

寻找一种以 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 …

c optimization

5
推荐指数
1
解决办法
444
查看次数