gpt4 book ai didi

c - 64 位机器上内存中的结构表示

转载 作者:太空狗 更新时间:2023-10-29 17:22:59 26 4
gpt4 key购买 nike

出于好奇,我编写了一个程序来显示我的结构的每个字节。这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <limits.h>

#define MAX_INT 2147483647
#define MAX_LONG 9223372036854775807

typedef struct _serialize_test{
char a;
unsigned int b;
char ab;
unsigned long long int c;
}serialize_test_t;


int main(int argc, char**argv){
serialize_test_t *t;
t = malloc(sizeof(serialize_test_t));
t->a = 'A';
t->ab = 'N';
t->b = MAX_INT;
t->c = MAX_LONG;

printf("%x %x %x %x %d %d\n", t->a, t->b, t->ab, t->c, sizeof(serialize_test_t), sizeof(unsigned long long int));

char *ptr = (char *)t;

int i;
for (i=0; i < sizeof(serialize_test_t) - 1; i++){
printf("%x = %x\n", ptr + i, *(ptr + i));
}

return 0;
}

这是输出:

41 7fffffff 4e ffffffff 24 8
26b2010 = 41
26b2011 = 0
26b2012 = 0
26b2013 = 0
26b2014 = ffffffff
26b2015 = ffffffff
26b2016 = ffffffff
26b2017 = 7f
26b2018 = 4e
26b2019 = 0
26b201a = 0
26b201b = 0
26b201c = 0
26b201d = 0
26b201e = 0
26b201f = 0
26b2020 = ffffffff
26b2021 = ffffffff
26b2022 = ffffffff
26b2023 = ffffffff
26b2024 = ffffffff
26b2025 = ffffffff
26b2026 = ffffffff

问题是:如果 sizeof(long long int) 是 8,那么为什么 sizeof(serialize_test_t) 是 24 而不是 32 - 我一直认为结构的大小四舍五入到最大类型并相乘按字段数,例如:8(bytes)*4(fields) = 32(bytes) — 默认情况下,没有 pragma pack 指令?

此外,当我将该结构转换为 char * 时,我可以从输出中看到内存中值之间的偏移量不是 8 个字节。你能给我一个线索吗?或者这可能只是一些编译器优化?

最佳答案

在像 SPARC 或 Intel [34]86 这样的现代 32 位机器上,或者从 68020 开始的任何摩托罗拉芯片上,每个数据项通常必须是“自对齐的”,从一个地址开始其类型大小的倍数。因此,32 位类型必须在 32 位边界上开始,16 位类型在 16 位边界上,8 位类型可以在任何地方开始,结构/数组/union 类型具有它们最严格的成员对齐。

结构的总大小将取决于包装。在您的情况下,它为 8 字节,因此最终结构看起来像

typedef struct _serialize_test{

char a;//size 1 byte

padding for 3 Byte;

unsigned int b;//size 4 Byte

char ab;//size 1 Byte again

padding of 7 byte;

unsigned long long int c;//size 8 byte

}serialize_test_t;

通过这种方式,前两个和后两个正确对齐,总大小达到 24。

关于c - 64 位机器上内存中的结构表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16566473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com