Tag: 填充

是否保证C中的数组元素将连续存储,没有填充?

换句话说:如果我有这样分配的数组,它是否可以保证: void *arr = calloc(nmemb, sizeof(some_type)) 那么elta , eltb , eltc都将指向内存中的相同位置,这将是此数组some_type类型的第二个元素? some_type *elta = &((some_type*)arr)[1]; some_type *eltb = ((some_type*)arr)+1; some_type *eltc = (char*)arr+sizeof(some_type); 我问这个的原因是因为我试图在C中做一个“容器”,如果这不成立,那么我就没有想法如何返回指向除第一个之外的任何其他元素的指针。

C中结构中的填充量是编译器相关还是定义良好?

C struct的填充量是否在标准或编译器和/或目标体系struct很好的定义。 我在标准中找不到答案。

为什么结构中只有“char”类型的成员没有填充?

我在结构中只声明了char类型的成员。 #include struct st { char c1; char c2; char c3; char c4; char c5; }; int main() { struct st s; printf(“%zu\n”, sizeof(s)); return 0; } 输出: [ 现场演示 ] 5 那么,为什么结构中只有char类型成员没有填充?

如何告诉gcc在struct中禁用填充?

我不确定它是否正常或者它是编译器错误但是我有一个包含很多成员的C结构。 其中包括: struct list { … … const unsigned char nop=0x90; // 27 bytes since the begining of the structure const unsigned char jump=0xeb; // 28 bytes since the begining of the structure const unsigned char hlt=0xf4; // 29 bytes since the begining of the structure unsigned __int128 i=0xeb90eb90eb90eb90f4f4 // should start at the 30th […]

为什么在这种情况下不会发生填充?

据我所知,默认情况下将完成4字节对齐。 说 typedef struct { int data7; unsigned char data8; //3 -bytes will be added here. }Sample1; sizeof(Sample1)将为8。 但对于以下结构,为什么没有发生填充? typedef struct { unsigned char data1; unsigned char data2; unsigned char data3; unsigned char data4; unsigned char data5; unsigned char data6; }Sample2; 但sizeof(Sample2)仅为6。 Sample2不是4字节对齐的结构? 编辑:: 按照Wiki 数据对齐意味着将数据放入存储器偏移量等于字大小的某个倍数,这会因CPU处理内存的方式而提高系统性能。 但Sample2的成员不会以两个的倍数对齐? 谢谢。

C问题:无符号整数和按位运算中的填充位(C89)

我有很多代码对无符号整数执行按位运算。 我编写了我的代码,假设这些操作是在固定宽度的整数上,没有任何填充位。 例如,32位无符号整数的数组,其中所有32位可用于每个整数。 我希望使我的代码更具可移植性,并且我专注于确保我符合C89 (在这种情况下)。 我遇到的一个问题是填充整数。 拿这个极端的例子,取自GMP手册 : 然而,在Cray矢量系统上,可以注意到short和int总是以8个字节存储(并且sizeof指示),但仅使用32或46位。 指甲function可以通过传递例如8 * sizeof(int)-INT_BIT来解决这个问题。 我也在其他地方读过这种类型的填充物。 我昨晚真的在SO上看了一篇post(请原谅我,我没有链接,我要引用类似记忆的东西),如果你有一个带有60个可用位的双,另外4个可以用于填充和那些填充位可以用于某些内部目的,因此它们不能被修改。 例如,假设我的代码是在一个平台上编译的,其中unsigned int类型的大小为4个字节,每个字节为8位,但最重要的2位是填充位。 在这种情况下,UINT_MAX会是0x3FFFFFFF(1073741823)吗? #include #include /* padding bits represented by underscores */ int main( int argc, char **argv ) { unsigned int a = 0x2AAAAAAA; /* __101010101010101010101010101010 */ unsigned int b = 0x15555555; /* __010101010101010101010101010101 */ unsigned int c = a […]

为什么类的大小取决于成员声明的顺序? 如何?

有人解释我如何在类中的成员声明的顺序决定该类的大小。 例如 : class temp { public: int i; short s; char c; }; 上面这个类的大小是8个字节。 但是当成员声明的顺序改变如下 class temp { public: char c; int i; short s; }; 那么类的大小是12个字节。 怎么样?

C数组可以在元素之间包含填充吗?

我听说有传言说,在C语言中,包含在结构中的数组可能在数组元素之间添加了填充。 显然,填充量不能在任何元素对之间变化,或者使用简单的指针算法计算数组中的下一个元素是不可能的。 这个谣言还指出,结构中没有包含的数组保证不包含填充。 我知道至少那部分是真的。 因此,在代码中,谣言是: { // Given this: struct { int values[20]; } foo; int values[20]; // This may be true: sizeof(values) != sizeof(foo.values); } 我很确定sizeof(values)总是等于sizeof(foo.values) 。 但是,我无法在C标准(特别是C99)中找到明确证实或否认这一点的任何内容。 有谁知道这个谣言是否在任何C标准中得到解决? 编辑 :我知道数组foo.values的结尾和struct foo的结尾之间可能存在填充,并且标准声明foo的开头和foo.values的开头之间没有填充。 但是,是否有人引用或引用标准,其中foo.values的元素之间没有填充?

有没有办法在编译时计算整数类型的宽度?

以char / bytes为单位的整数类型(或任何类型)的大小很容易计算为sizeof(type) 。 常见的习惯用法是乘以CHAR_BIT以找到该类型占用的位数,但是在使用填充位的实现中,这将不等于值位的宽度 。 更糟糕的是,代码如下: x>>CHAR_BIT*sizeof(type)-1 如果CHAR_BIT*sizeof(type)大于CHAR_BIT*sizeof(type)的实际宽度,则实际上可能具有未定义的行为。 为简单起见,我们假设我们的类型是无符号的。 那么type的宽度是ceil(log2((type)-1) 。有没有办法将这个值计算为常量表达式?