以下节选自here

pw = (widget *)malloc(sizeof(widget));

分配原始存储.实际上,malloc调用分配存储 够大了,而且是suitably aligned to hold an object型的 小组件

还有赫伯·萨特的fast pImpl篇,他说:

Alignment.任何内存对齐.任何分配的内存

我很好奇,malloc如何知道自定义类型的对齐方式?

推荐答案

对齐要求是递归的:任何struct的对齐只是其任何成员的最大对齐,这是递归理解的.

例如,假设每个基本类型的对齐等于其大小(通常不总是如此),则struct X { int; char; double; }具有double的对齐,并且它将被填充为双精度大小的倍数(例如,4(整型)、1(字符)、3(填充)、8(双精度)).struct Y { int; X; float; }具有X的对齐,这是最大的并且等于double的对齐,并且Y相应地被布局:4(整型)、4(填充)、16(X)、4(浮动)、4(填充).

(所有数字都只是示例,在您的机器上可能会有所不同.)

因此,通过将其分解为基本类型,我们只需要知道几个基本路由,其中有一个众所周知的最大路由.C++甚至定义了一个max_align_t的对齐方式is最大对齐方式.

所有malloc()需要做的就是 Select 一个该值的倍数的地址.

C++相关问答推荐

根据工具链文件中的定义替换单个函数定义

错误:在.h程序中重新定义 struct

如果实际的syscall是CLONE(),那么为什么strace接受fork()呢?

为什么我得到更多的256假阳性在PKZIP解密密钥验证?

有没有可能我不能打印?(C,流程)

C-使用指针返回修改后的整数数组

如何在C语言中正确打印图形

在基本OpenGL纹理四边形中的一个三角形中进行渲染

X64:并发写入布尔数组

getline()从c中的外部函数传递指针时输出null

在for循环中指向数组开头之前

在vfork()之后,链接器如何在不 destruct 父内存的情况下解析execve()?

在C程序中使用Beaglebone Black UART的问题

赋值两侧的后置增量,字符指针

通过char*访问指针的对象表示是未定义的行为吗?

函数指针作为函数参数 - 应该使用 const 吗?

这些表达式是否涉及 C 中定义的复合文字?

使用替代日历打印日期

C 中从 Unix 纪元时间转换的损坏

C语言程序流程解释