简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
🍉🍉🍉文章目录🍉🍉🍉
- 🌻1.前言
- 🌻2.C语言之aligned关键字介绍
- 🌻3.代码实例
- 🐓3.1 单个变量的对齐
- 🐓3.2 结构体的对齐
- 🐓3.3 指定类型对齐
🌻1.前言
本篇目的:Linux内核之aligned用法实例
🌻2.C语言之aligned关键字介绍
- 在Linux内核中,
aligned
关键字是一个编译器指令,它用于指定变量或结构体的对齐方式。对齐是指变量或结构体在内存中的起始地址与某个数的倍数对齐。对齐对于性能至关重要,特别是在处理对齐敏感的数据类型(如浮点数)或使用SIMD指令时。正确的对齐可以减少内存访问时间,提高程序的性能。 - 在Linux内核中,
aligned
关键字通常与__attribute__((aligned(n)))
一起使用,其中n
是一个整数,指定了对齐边界。n
必须是2的幂,因为大多数处理器和内存系统都对齐到2的幂边界上的地址。 aligned
关键字的使用方法如下:-
- 用于单个变量:可以将
aligned
关键字用于单个变量,以指定其对齐方式。例如:
- 用于单个变量:可以将
int var __attribute__((aligned(16))) = 42;
- 在这个例子中,变量
var
的起始地址将与16的倍数对齐。这意味着,无论var
在内存中的位置如何,它的地址都将是一个16的倍数。 -
- 用于结构体:可以将
aligned
关键字用于结构体,以指定其成员的对齐方式。例如:
- 用于结构体:可以将
struct example {
int a;
float b;
} __attribute__((aligned(32)));
- 在这个例子中,结构体
example
的起始地址将与32的倍数对齐。这意味着,无论example
在内存中的位置如何,它的地址都将是一个32的倍数。 -
- 用于数组和指针:可以将
aligned
关键字用于数组和指针,以指定它们的对齐方式。例如:
- 用于数组和指针:可以将
int arr[10] __attribute__((aligned(64)));
int *ptr __attribute__((aligned(128)));
- 在这个例子中,数组
arr
的起始地址将与64的倍数对齐,指针ptr
的起始地址将与128的倍数对齐。 - 需要注意的是,使用
aligned
关键字指定的对齐方式可能会增加内存消耗。在上面的例子中,虽然我们只需要一个整数变量,但是由于对齐到16字节边界,编译器可能会在变量前后添加额外的填充字节,以确保对齐。因此,在使用aligned
关键字时,需要权衡内存消耗和性能优化。 aligned
关键字在Linux内核中用于指定变量、结构体或数组的对齐方式。它可以优化内存访问速度,特别是在处理对齐敏感的数据类型时。但需要注意的是,使用aligned
关键字可能会增加内存消耗。在实际应用中,应根据具体需求和对齐要求进行权衡。
🌻3.代码实例
🐓3.1 单个变量的对齐
#include <stdio.h>
int main() {
int var __attribute__((aligned(16))) = 42;
printf("Address of var: %p\n", (void*)&var);
return 0;
}
- 变量 a 被指定为对齐到16字节边界。
问题一:为什么按16字节对齐,但是打印时sizeof(var) = 4?
- 虽然 a 指定为在内存中以 16 字节边界对齐,但其大小仍然是基本类型 int 的大小,通常情况下是4字节(在大多数平台上)。
- 这意味着虽然变量 a 在内存中可能按照16字节边界对齐,但它仍然只占用4个字节的空间。
🐓3.2 结构体的对齐
#include <stdio.h>
int main() {
// 使用 aligned(16) 将变量 a 对齐到 16 字节边界
int a __attribute__((aligned(16))) = 10;
printf("Size of a: %lu\n", sizeof(a));
printf("Address of a: %p\n", (void *)&a);
return 0;
}
- AlignedStruct 结构体被指定为对齐到32字节边界
🐓3.3 指定类型对齐
#include <stdio.h>
typedef int aligned_int __attribute__((aligned(8)));
int main() {
aligned_int num = 5;
printf("Size of num: %lu\n", sizeof(num));
printf("Address of num: %p\n", (void *)&num);
return 0;
}
- aligned_int 类型被定义为对齐到8字节边界的整型。