C/C++编译器的字节对齐方式

C/C++编译器的缺省字节对齐方式为自然对界。即在缺省情况下,编译器为每一个变量或是数据单元按其自然对界条件分配空间。

在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储(成员之间可能有插入的空字节),第一个成员的地址和整个结构的地址相同。

  1. 编译器缺省的结构成员自然对界条件为"N字节对齐",N即该成员数据类型的长度。如int型成员的自然对界条件为4字节对齐,而double类型的结构成员的自然对界条件为8字节对齐。若该成员的起始偏移不位于该成员的"默认自然对界条件"上,则在前一个节面后面添加适当个数的空字节。
  2. 编译器缺省的结构整体自然对界条件为:该结构所有成员中要求的最大自然对界条件。若结构体各成员长度之和不为"结构整体自然对界条件的整数倍",则在最后一个成员后填充空字节。

例子:

c 复制代码
struct Test
{ 
  char x1; // 成员x1为char型(其起始地址必须1字节对界),其偏移地址为0
  char x2; // 成员x2为char型(其起始地址必须1字节对界,其偏移地址为1
  float x3; // 成员x3为float型(其起始地址必须4字节对界),编译器在x2和x3之间填充了两个空字节,其偏移地址为4
  char x4; // 成员x4为char型(其起始地址必须1字节对界),其偏移地址为8
};

在Test结构体中,最大的成员为float x3,因此结构体的自然对界条件为4字节对齐。则结构体长度就为12字节,内存布局为1100 1111 1000。

相关推荐
周杰伦_Jay6 分钟前
【Go微服务框架深度对比】Kratos、Go-Zero、Go-Micro、GoFrame、Sponge五大框架
开发语言·微服务·golang
杰瑞哥哥14 分钟前
标准 Python 项目结构
开发语言·python
shykevin17 分钟前
Rust入门
开发语言·后端·rust
QT 小鲜肉20 分钟前
【个人成长笔记】将Try Ubuntu里面配置好的文件系统克隆在U盘上(创建一个带有持久化功能的Ubuntu Live USB系统)
linux·开发语言·数据库·笔记·ubuntu
Pointer Pursuit25 分钟前
C++——二叉搜索树
开发语言·c++
澪吟28 分钟前
C++ 从入门到进阶:核心知识与学习指南
开发语言·c++
热爱编程的小白白1 小时前
【Playwright自动化】安装和使用
开发语言·python
听风吟丶1 小时前
Java NIO 深度解析:从 BIO 到 NIO 的演进与实战
开发语言·python
学历真的很重要1 小时前
LangChain V1.0 Messages 详细指南
开发语言·后端·语言模型·面试·langchain·职场发展·langgraph
sali-tec1 小时前
C# 基于halcon的视觉工作流-章58-输出点云图
开发语言·人工智能·算法·计算机视觉·c#