(12)--2C结构体中数据的内存对齐问题.docVIP

  • 5
  • 0
  • 约3.2千字
  • 约 4页
  • 2023-11-15 发布于陕西
  • 举报
C结构体中数据的内存对齐问题 当在C中定义了一个结构类型时,它的大小是否等于各字段(field)大小之和?编译器将如何在内存中放置这些字段?ANSI C对结构体的内存布局有什么要求?而我们的程序又能否依赖这种布局?这些问题或许对不少朋友来说还有点模糊,那么本文就试着探究它们背后的秘密。 首先,至少有一点可以肯定,那就是ANSI C保证结构体中各字段在内存中出现的位置是随它们的声明顺序依次递增的,并且第一个字段的首地址等于整个结构体实例的首地址。比如有这样一个结构体: struct vector{ int x,y,z; }s; int *p, *q, *r; struct vector *ps; p = s.x; q = s.y; r = s.z; ps = s; assert(p q); assert(p r); assert(q r); assert((int*)ps == p); //上述断言一定不会失败 这时,有人可能会问: 标准是否规定相邻字段在内存中也相邻? 。ANSI C没有做出保证,你的程序在任何时候都不应该依赖这个假设。那这是否意味着我们永远无法勾勒出一幅更清晰更精确的结构体内存布局图?当然不是。我们先来了解一下内存对齐的问题。 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或

文档评论(0)

1亿VIP精品文档

相关文档