【ARM 嵌入式 编译系列 11.1 -- GCC __attribute__((aligned(x)))详细介绍】

文章目录

    • __attribute__((aligned(x)))详细介绍
      • 其它对齐方式

上篇文章:ARM 嵌入式 编译系列 11 – GCC attribute((packed))详细介绍

attribute((aligned(x)))详细介绍

__attribute__((aligned(x))) 是 GCC 编译器的一个特性,它可以用于变量或类型,用来指定它们在内存中的对齐方式。

默认情况下,编译器会对数据按照特定的对齐原则进行对齐,以提高处理器对数据的访问效率。例如,一个 int 类型的变量在大多数系统上默认会按照 4 字节对齐。

使用 __attribute__((aligned(x))) 可以指定变量或类型的对齐方式,其中 x 是对齐的字节数,必须是 2 的幂次。编译器将保证变量或类型的地址是指定字节数的倍数。

以下是一个示例:

#include 

struct aligned_struct 
{ 
	char a; 
	int b; 
} __attribute__((aligned(16))); 

int main(void) 
{ 
	struct aligned_struct s; 
	
	printf("Size of aligned_struct: %lu\n", sizeof(struct aligned_struct)); 
	printf("Address of s: %p\n", &s); 

	return 0; 
}

在这个示例中,aligned_struct 结构体使用 __attribute__((aligned(16))) 指定了 16 字节的对齐方式。因此,它的大小是成员 char aint b 的大小的总和,没有额外的填充字节。同时,aligned_struct 的地址将是 16 的倍数。

ThinkStation-T350 (*^~^*) ~/workbase/test> gcc test2.c
ThinkStation-T350 (*^~^*) ~/workbase/test> ./a.out
Size of aligned_struct: 16
Address of s: 0x7ffe938d4ba0

通过指定对齐方式,可以确保特定类型的数据在内存中按照要求的边界对齐,提高处理器对数据的访问效率。
但是请注意,如果对齐方式超过硬件和操作系统的支持范围,可能会导致编译错误。

其它对齐方式

在GCC中,你可以使用 -fpack-struct-falign-* 系列选项来指定编译时的对齐方式。

-fpack-struct[=n]:这个选项会指定结构体的对齐方式。如果没有给出 n,结构体将被紧凑打包,即没有对齐。如果给出了 n,则所有的结构体成员都将按 n 字节对齐。

例如:

gcc -fpack-struct=1 -o myprogram myprogram.c

这个命令将使 myprogram.c 中的所有结构体成员都按1字节对齐。

-falign-functions=n:这个选项会指定函数代码的对齐方式,n 是对齐的字节数,必须是2的幂次。

例如:

gcc -falign-functions=4 -o myprogram myprogram.c

这个命令将使 myprogram.c 中的所有函数的代码都按4字节对齐。

注意:在大多数情况下,你应该让编译器使用默认的对齐方式,除非你有特别的需要。更改默认的对齐方式可能会影响代码的性能和兼容性。

上篇文章:ARM 嵌入式 编译系列 11 – GCC attribute((packed))详细介绍

你可能感兴趣的:(#,ARM,GCC,编译系列介绍,arm开发,aligned,gcc,对齐方式)