内存连续的问题

杀意已决 2014-02-27 05:07:46
现有几个结构体嵌套,内存对齐的情况下,结构体成员的所有数据在内存中是连续的吗




请高手解答一下,谢谢
...全文
197 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2014-02-27
  • 打赏
  • 举报
回复
引用 6 楼 zmlovelx 的回复:
pack为1的时候是连续的。
++
mujiok2003 2014-02-27
  • 打赏
  • 举报
回复
使用编译器的选项可以输出类型的内存布局,比如VC的
richyhuang 2014-02-27
  • 打赏
  • 举报
回复
压缩的时候是连续的,比如tcp的结构体,ip的结构体等都是具体例子
ma100 2014-02-27
  • 打赏
  • 举报
回复
sizeof一致即连续
rendason 2014-02-27
  • 打赏
  • 举报
回复
http://blog.csdn.net/lichunming83/archive/2009/10/31/4752818.aspx这有一些结构体方面的知识,仅供参考。
Orange_ou 2014-02-27
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
#include <stdio.h>
#define field_offset(s,f) (int)(&(((struct s *)(0))->f))
struct AD  { int a; char b[13]; double c;};
#pragma pack(push)
#pragma pack(1)
struct A1  { int a; char b[13]; double c;};
#pragma pack(2)
struct A2  { int a; char b[13]; double c;};
#pragma pack(4)
struct A4  { int a; char b[13]; double c;};
#pragma pack(8)
struct A8  { int a; char b[13]; double c;};
#pragma pack(16)
struct A16 { int a; char b[13]; double c;};
#pragma pack(pop)
int main() {
    printf("AD.a %d\n",field_offset(AD,a));
    printf("AD.b %d\n",field_offset(AD,b));
    printf("AD.c %d\n",field_offset(AD,c));
    printf("\n");
    printf("A1.a %d\n",field_offset(A1,a));
    printf("A1.b %d\n",field_offset(A1,b));
    printf("A1.c %d\n",field_offset(A1,c));
    printf("\n");
    printf("A2.a %d\n",field_offset(A2,a));
    printf("A2.b %d\n",field_offset(A2,b));
    printf("A2.c %d\n",field_offset(A2,c));
    printf("\n");
    printf("A4.a %d\n",field_offset(A4,a));
    printf("A4.b %d\n",field_offset(A4,b));
    printf("A4.c %d\n",field_offset(A4,c));
    printf("\n");
    printf("A8.a %d\n",field_offset(A8,a));
    printf("A8.b %d\n",field_offset(A8,b));
    printf("A8.c %d\n",field_offset(A8,c));
    printf("\n");
    printf("A16.a %d\n",field_offset(A16,a));
    printf("A16.b %d\n",field_offset(A16,b));
    printf("A16.c %d\n",field_offset(A16,c));
    printf("\n");
    return 0;
}
//AD.a 0
//AD.b 4
//AD.c 24
//
//A1.a 0
//A1.b 4
//A1.c 17
//
//A2.a 0
//A2.b 4
//A2.c 18
//
//A4.a 0
//A4.b 4
//A4.c 20
//
//A8.a 0
//A8.b 4
//A8.c 24
//
//A16.a 0
//A16.b 4
//A16.c 24
//
//
赵老湿的代码就是经典 到处都能用
常书 2014-02-27
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    char a;
    int b;
    int c
}A;

typedef struct
{
    char a;
    A   b;
    int  c;
}B;

int main(void)
{
    B test = {0};
    printf("%x\n%x\n%x\n%x\n%x\n",&test.a,&test.b.a,&test.b.b,&test.b.c,&test.c);
    system("PAUSE");	
    return 0;
}
22ff50 22ff54 22ff58 22ff5c 22ff60 排除字节对齐,内存中a b c肯定也是按顺序连在一起的
帅得不敢出门 2014-02-27
  • 打赏
  • 举报
回复
pack为1的时候是连续的。
赵4老师 2014-02-27
  • 打赏
  • 举报
回复
#include <stdio.h>
#define field_offset(s,f) (int)(&(((struct s *)(0))->f))
struct AD  { int a; char b[13]; double c;};
#pragma pack(push)
#pragma pack(1)
struct A1  { int a; char b[13]; double c;};
#pragma pack(2)
struct A2  { int a; char b[13]; double c;};
#pragma pack(4)
struct A4  { int a; char b[13]; double c;};
#pragma pack(8)
struct A8  { int a; char b[13]; double c;};
#pragma pack(16)
struct A16 { int a; char b[13]; double c;};
#pragma pack(pop)
int main() {
    printf("AD.a %d\n",field_offset(AD,a));
    printf("AD.b %d\n",field_offset(AD,b));
    printf("AD.c %d\n",field_offset(AD,c));
    printf("\n");
    printf("A1.a %d\n",field_offset(A1,a));
    printf("A1.b %d\n",field_offset(A1,b));
    printf("A1.c %d\n",field_offset(A1,c));
    printf("\n");
    printf("A2.a %d\n",field_offset(A2,a));
    printf("A2.b %d\n",field_offset(A2,b));
    printf("A2.c %d\n",field_offset(A2,c));
    printf("\n");
    printf("A4.a %d\n",field_offset(A4,a));
    printf("A4.b %d\n",field_offset(A4,b));
    printf("A4.c %d\n",field_offset(A4,c));
    printf("\n");
    printf("A8.a %d\n",field_offset(A8,a));
    printf("A8.b %d\n",field_offset(A8,b));
    printf("A8.c %d\n",field_offset(A8,c));
    printf("\n");
    printf("A16.a %d\n",field_offset(A16,a));
    printf("A16.b %d\n",field_offset(A16,b));
    printf("A16.c %d\n",field_offset(A16,c));
    printf("\n");
    return 0;
}
//AD.a 0
//AD.b 4
//AD.c 24
//
//A1.a 0
//A1.b 4
//A1.c 17
//
//A2.a 0
//A2.b 4
//A2.c 18
//
//A4.a 0
//A4.b 4
//A4.c 20
//
//A8.a 0
//A8.b 4
//A8.c 24
//
//A16.a 0
//A16.b 4
//A16.c 24
//
//
杀意已决 2014-02-27
  • 打赏
  • 举报
回复
引用 3 楼 zhuobattle 的回复:
你说的继续是忽略对齐产生的填充数据吗?如果是的话,那么是连续的。
确定内存对齐就一定连续呗,你说是就是肯定是
zhuobattle 2014-02-27
  • 打赏
  • 举报
回复
你说的继续是忽略对齐产生的填充数据吗?如果是的话,那么是连续的。
杀意已决 2014-02-27
  • 打赏
  • 举报
回复
引用 1 楼 YTerrenceLau 的回复:
不一定连续,特殊设计的才会连续。数据元素之间有可能被填充一些无用的数据以提升访问效率。
不明白
YTerrenceLau 2014-02-27
  • 打赏
  • 举报
回复
不一定连续,特殊设计的才会连续。数据元素之间有可能被填充一些无用的数据以提升访问效率。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧