`

C语言内存对齐详解(3)

阅读更多

接上一篇:C语言内存对齐详解(2)

在minix的stdarg.h文件中,定义了如下一个宏:

/* Amount of space required in an argument list for an arg of type TYPE.
 * TYPE may alternatively be an expression whose type is used.
 */

#define __va_rounded_size(TYPE)  \
  (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))

 从注释以及宏的名字可以看出是有关内存对齐方面的作用。根据前两篇关于C语言内存对齐方面的理论可知n字节对齐就是说变量存放的起始地址的偏移量有两种情况:

第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式(各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数);

第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。

 

此时n = 4,对于sizeof(TYPE)一定为自然数,sizeof(int) - 1 = 3

sizeof(TYPE)只可能出现如下两种情况:

(1) 当sizeof(TYPE) >= 4,偏移量 = (sizeof(TYPE)/4)*4

(2) 当sizeof(TYPE) < 4,偏移量 = 4

此时sizeof(TYPE) = 1 or 2 or 3,而(sizeof(TYPE) + 3) / 4  = 1

 

为了将上述两种情况统一,偏移量 = ((sizeof(TYPE) + 3) / 4) * 4

在有的源代码中,将内存对齐宏__va_rounded_size通过位操作来实现,代码如下:

#define __va_rounded_size(TYPE)  \
   ((sizeof(TYPE)+sizeof(int)-1)&~(sizeof(int)-1))

 (sizeof(TYPE) + sizeof(int) – 1)就是将大于4m但小于等于4(m+1)的数提高到大于等于4(m+1)但小于4(m+2),这样再& ~(sizeof(int) – 1) )后就正好将原长度补齐到4的倍数了。

 

1
3
分享到:
评论

相关推荐

    C语言字节对齐详解

    ### C语言字节对齐详解 #### 一、什么是对齐,以及为什么要对齐 现代计算机内存是由一个个字节组成的,理论上来说,任何类型的变量都可以从任意地址开始存放。但在实际操作中,为了提高访问效率,不同的数据类型...

    C语言字节对齐问题详解

    C语言字节对齐问题详解 C语言中的字节对齐问题是指在编译器将C语言程序编译成机器代码时,对变量的存储方式进行调整,以提高存取效率和减少存储空间。字节对齐是指在内存中将变量按照一定的规则排列,以便在访问...

    C语言数据存储对齐详解

    C语言中的数据存储对齐是编译器为了提高内存访问效率和硬件兼容性而采用的一种策略。它涉及到如何在内存中安排数据结构的各个成员,确保数据读取和写入时能够快速高效地进行。对齐规则主要有以下几点: 1. **成员按...

    语言:内存字节对齐详解

    内存字节对齐是一种编程实践中遵循的规则,它涉及到如何在计算机内存中安排数据结构的成员,以便提高访问效率和兼容性。理解内存对齐至关重要,因为它直接影响到程序的性能和跨平台兼容性。 首先,我们要明白什么是...

    c语言字节对齐

    ### C语言中的字节对齐详解 #### 一、引言 字节对齐是C语言编程中的一个重要概念,尤其在处理复杂数据结构时尤为重要。本文将深入探讨字节对齐的基本原理、目的以及如何在实际开发中进行合理配置。 #### 二、字节...

    内存对齐 详细介绍内存对齐的原理

    ### 内存对齐原理详解 #### 一、什么是内存对齐? 在计算机科学中,内存对齐(Memory Alignment)是指数据类型与内存地址之间的关系。简单来说,就是指数据结构(尤其是结构体中的成员)在内存中的起始地址应该...

    5分钟搞定内存字节对齐

    C语言内存字节对齐详解 在C语言中,内存字节对齐是指编译器为了提高程序执行效率和可移植性,而对结构体成员在内存中的存储方式进行的调整。这个调整是基于体系结构的对齐规则,旨在提高程序的执行效率和可移植性。...

    C语言中的字节对齐详解。

    C语言中的字节对齐详解 字节对齐是一种内存存储方式,在现代计算机中,内存空间都是按照byte划分的。在理论上讲,似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定...

    c语言实例详解

    - 内存对齐:理解内存对齐的重要性,以及如何影响变量在内存中的布局。 8. **文件操作** - 打开与关闭文件:掌握fopen()和fclose()函数的使用,进行文件的读写操作。 - 文件读写:学习fread(), fwrite(), fgets...

    c语言开发实例详解

    - 内存对齐与性能优化:了解内存对齐的影响及如何通过内存管理优化程序性能。 9. **实例详解** - 简单的程序设计:如计算器、猜数字游戏等。 - 小型游戏:例如井字游戏、猜单词游戏等,这些实例将帮助你综合运用...

    C语言、C++内存对齐问题详解

    本文将深入解析C语言和C++中的内存对齐问题。 首先,内存对齐的主要目的是提高程序执行的效率。计算机的处理器在处理数据时,通常会一次性读取或写入多个字节的数据,例如,32位处理器可能一次处理4个字节。如果...

    c语言结构体知识详解

    (3)内存对齐优化:结构体成员变量的排列方式会影响内存访问效率。CPU在访问内存时,通常按照特定的对齐方式进行,如按字节、字或双字对齐。合理地设计结构体,可以使数据在内存中的布局更加紧凑,从而提高访问速度...

    C语言memset用法详解.zip

    - `memset`不能用于填充浮点数数组,因为浮点数的内存表示方式不是字节对齐的,可能会导致意想不到的结果。 - 在处理大内存区域时,`memset`比循环更高效,因为它通常由编译器优化成汇编级别的指令,直接操作内存...

    C语言常见内存错误

    ### C语言常见内存错误详解 #### 一、内存泄露 内存泄露是指在程序运行过程中,开发者在堆上分配的内存,如果没有及时释放,就会导致这部分内存无法被再次利用,最终可能导致整个系统的可用内存逐渐减少。虽然一两...

    C语言每日一题:结构体的内存大小

    ### C语言结构体内存对齐详解 在C语言中,结构体是一种复合数据类型,它允许程序员将不同类型的变量组织在一起作为一个单元。本篇文章将详细解释C语言中的结构体内存对齐原理,并通过一个具体的例子来说明如何计算...

Global site tag (gtag.js) - Google Analytics