Tag: 对齐

数据与网络编程对齐

关于数据对齐,我有点困惑。 在x86上,我们通常认为对齐是理所当然的。 但是,我正在对一个非常严格的系统进行编程,如果我尝试访问未对齐的数据,则会出错。 inheritance人我的问题: 首先,我将向您展示我的一些结构: struct sniff_ethernet { u_char ether_dhost[6]; /* Destination host address */ u_char ether_shost[6]; /* Source host address */ u_short ether_type; /* IP? ARP? RARP? etc */ }; struct sniff_ip { u_char ip_vhl; /* version <> 2 */ u_char ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short […]

__attribute __((__ align__))不使用静态变量

这让我疯了好几天。 如果我将它声明为static我无法将数组对齐到16。 任何帮助非常感谢。 经过修改的版本: #include #include #define MAX_INPUTS 250 int main() { float input[MAX_INPUTS] __attribute__ ((__aligned__(16))); printf(“Address of input: %p\n”, input); printf(“Assert1: %x\n”, ( ((int) (input)) ) ); printf(“Assert2: %x\n”, ( ((int) (input)) % 16 ) ); printf(“Assert3: %x\n”, ( ((int) (input)) % 16 ) == 0 ); assert ( ( ((int) (input)) ) ); […]

与对齐有关的问题

在函数中的局部范围内声明时,将所有相同类型的变量组合在一起是一种好的做法吗? 如果是,为什么? 它是否解决了内存对齐问题?

长长的对齐问题(MSVC与GCC)

我正在编写C跨平台库,但最终我的unit testing中出现错误,但仅限于Windows机器上。 我已经跟踪了这个问题并发现它与结构的对齐有关(我正在使用结构数组来保存多个类似对象的数据)。 问题是:memset(sizeof(struct))和设置结构成员逐个产生不同的字节到字节结果,因此memcmp()返回“不相等”的结果。 这里的代码为: #include #include typedef struct { long long a; int b; } S1; typedef struct { long a; int b; } S2; S1 s1, s2; int main() { printf(“%d %d\n”, sizeof(S1), sizeof(S2)); memset(&s1, 0xFF, sizeof(S1)); memset(&s2, 0x00, sizeof(S1)); s1.a = 0LL; s1.b = 0; if (0 == memcmp(&s1, &s2, sizeof(S1))) printf(“Equal\n”); […]

为什么内存对齐会在结构中发生变化?

在前一个问题中 ,我了解到当具有8字节对齐的结构嵌入到具有4字节对齐的另一个结构中时,在8字节对齐结构之前需要填充。 了解。 至少我以为我明白了。 VS 2012文档说: 对于结构,联合和数组,对齐要求是其成员的最大对齐要求。 所以,如果我有这样的结构: typedef struct s_inner { unsigned long ul1; double dbl1; fourth_struct s4; unsigned long ul2; int i1; } t_inner; 我希望这个结构的所有成员都是8字节对齐的,因为double是8字节对齐的。 但我的记忆转储告诉我这个: t_inner从地址1B8开始: 1B8 : unsigned long 1B8被填充,因为结构是8字节对齐的 1C0 : double 1C0消耗8个字节 1C8 : fourth_struct如下, 它具有4字节对齐 到目前为止,一切都如预期。 但是现在t_inner内部的对齐开关 :在地址1E8 ,我希望在这里只找到unsigned long int ,填充4个字节,以便后面的int也在8个字节上对齐。 但似乎对齐现在已经改变,因为unsigned long整数不携带填充字节。 相反,以下int以4字节对齐方式放置。 为什么对齐开关在t_inner ? 这里适用哪条规则?

如何最小化struct-type的内存使用?

对于Connect Four游戏的转置表(通常是哈希表),我想有效地使用内存(以存储尽可能多的元素)。 一个表元素必须存储以下信息: 锁:无符号64位 移动:[0..6] – >无符号3位 得分:[ – 2000..2000] – >签名12位 flag:VALID,UBOUND,LBOUND: – > unsigned 2 bit 高度:[ – 1..42]: – >签名7位 首先我尝试了以下数据结构,需要24个字节: struct TableEntry1 { unsigned __int64 lock; unsigned char move; short score; enum { VALID, UBOUND, LBOUND } flag; char height; }; 重新排列元素后,它需要16个字节(我找到了这种行为的答案 ): struct TableEntry2 { unsigned __int64 lock; enum { […]

C标准中char数组结构成员的对齐方式

让我们假设我想读/写一个tar文件头。 考虑到标准C(C89,C99或C11),char数组在结构上是否有任何特殊处理,关于填充? 编译器可以为这样的结构添加填充: struct header { char name[100]; char mode[8]; char uid[8]; char gid[8]; char size[12]; char mtime[12]; char chksum[8]; char typeflag; char linkname[100]; char tail[255]; }; 我已经看到它也用在网络上的代码中。 只是自由,将这个结构写入一个块中的文件,假设不会有任何填充。 当然也假设CHAR_BITS == 8 。 我认为这样的C代码是如此常见,标准会处理这种情况,但我无法找到它,也许我不会是一个好律师。 编辑 接受的答案将根据C标准之一给出严格或最严格的可移植实现,这使我可以使用标准库字符串函数处理这些字段。 考虑CHAR_BITS和所有。 我认为需要为此读取512 uint8_t的数组,之后可能会将它们逐个转换为chars。 有更简单的方法吗

对于不同的数据类型,内存对齐是否不同

C中的不同数据类型(如char , short , int , long , float , double是否具有不同的内存对齐边界? 在32位字对齐的字节可寻址操作系统中,如何访问char或short来访问int或float ? 在这两种情况下,CPU是否读取完整的32位字? 当int不在边界时会发生什么? 如何在任何内存地址读取char ?

什么是错位指针?

据我所知,在以下行中,我们尝试写入无效的内存位置。 但这实际上也是一个未对齐的指针。 有人可以解释什么是未对齐的指针,以及下面的未对齐指针是什么? *(int*)0xffffffff = 0xbad;

C:数据结构对齐

我正在使用结构,并对它们有几个问题。 据我所知,结构变量将按顺序放在内存中。 块长度(字)取决于机器架构(32位 – 4字节,64位 – 8字节)。 可以说我们有2个数据结构: struct ST1 { char c1; short s; char c2; double d; int i; }; 在内存中它将是: 32 bit – 20 bytes 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 […]