返回

解读对象的底层本质:8 字节对齐与 malloc 的秘密**

IOS

对象作为程序设计中的基本组成部分,其底层实现往往隐藏着复杂而有趣的原理。在 C++ 和 ObjC 等面向对象的编程语言中,对象的本质与内存分配策略息息相关,8 字节对齐和 malloc 的运用尤为关键。

8 字节对齐:性能与效率的基石

在计算机架构中,内存是以字节为单位进行寻址的。对于某些处理器来说,以特定字节对齐访问内存可以显著提高性能。8 字节对齐是一种常见的内存对齐方式,这意味着对象的内存地址必须是 8 的倍数。

在 C++ 和 ObjC 中,对象的成员变量在内存中按声明顺序依次排列。如果某个成员变量的类型占用字节数不是 8 的倍数,那么编译器会在其后填充额外的字节,以确保整体对象的对齐。例如,一个包含一个 char 类型成员变量的对象将实际占用 8 字节的内存,其中只有 1 字节用于存储 char 值。

8 字节对齐的优势在于,它可以提高处理器访问内存的速度。当处理器从内存中读取或写入数据时,如果数据的地址与处理器的内部缓存对齐,则可以减少缓存未命中率,从而提高性能。

malloc 的策略:巧妙分配,优化空间

malloc 是 C 语言中用于动态分配内存的标准库函数。它负责从堆中分配指定大小的内存块,并返回该块的地址。在实际实现中,malloc 采用了 16 字节对齐的策略。

16 字节对齐意味着,malloc 分配的内存块地址始终是 16 的倍数。这与 8 字节对齐看似矛盾,但实际上却是一种巧妙的权衡。

原因在于,16 字节对齐可以减少内存碎片,提高内存利用率。当程序多次分配和释放内存时,可能会产生不连续的内存块,称为内存碎片。16 字节对齐可以有效减少碎片,因为它将分配的内存块限制在 16 字节的倍数,从而减少了浪费空间。

8 字节对齐与 malloc 策略的交锋

前面埋下的伏笔是:当 malloc 分配了 16 字节的内存,而对象只使用了 8 字节时,多出来的 8 字节被用来做什么?

答案是:指针对齐。

在 C++ 和 ObjC 中,对象的引用实际上是指向该对象的指针。为了提高指针访问的速度,指针也需要对齐。在 64 位系统中,指针大小为 8 字节,因此对象引用也需要 8 字节对齐。

当对象只占用 8 字节时,malloc 分配的 16 字节内存中,有 8 字节用于存储对象本身,而多出来的 8 字节则用于存储对象的指针。这样一来,指针就可以完美对齐,从而提升引用对象的效率。

总结:底层原理的巧妙之美

对象的 8 字节对齐和 malloc 的 16 字节对齐策略看似复杂,但背后却蕴藏着巧妙的原理。它们共同作用,不仅提高了内存访问速度和指针效率,还优化了内存利用率。这些底层原理构成了面向对象编程语言高效运行的基础,为程序员提供了构建高性能应用程序的强大工具。