c语言 共用体 __attribute__
时间: 2023-11-22 18:48:52 浏览: 86
共用体(union)是一种特殊的数据类型,它允许您在相同的内存位置存储不同的数据类型。__attribute__是GCC编译器的一个特性,它允许您指定变量或类型的属性。在C语言中,您可以使用__attribute__来指定共用体的对齐方式。
以下是一个示例,演示如何在共用体中使用__attribute__:
```c
#include <stdio.h>
union Data {
int i;
float f;
char str[20];
} __attribute__((aligned(8)));
int main( ) {
union Data data;
printf( "Memory size occupied by data : %ld\n", sizeof(data));
return 0;
}
```
在这个示例中,我们定义了一个名为Data的共用体,它包含三个成员:整数i,浮点数f和字符数组str。我们使用__attribute__((aligned(8)))指定了共用体的对齐方式为8字节。这意味着共用体的起始地址必须是8的倍数。
相关问题
c语言中__attribute__
__attribute__是C语言中的一个编译属性,用于向编译器描述特殊的标识、错误检查或高级优化。它可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)等。下面是一些__attribute__的使用方法和示例:
1. 设置变量对齐方式为4字节对齐
```c
struct p {
int a;
char b;
char c;
} __attribute__((aligned(4))) pp;
```
这里使用了aligned属性,指定了pp结构体变量的对齐方式为4字节对齐。由于pp结构体中只有一个int类型的变量和两个char类型的变量,所以在4字节对齐的情况下,pp结构体变量的大小为8字节。
2. 设置变量为弱符号
```c
int foo() __attribute__((weak));
```
这里使用了weak属性,将foo函数设置为弱符号。如果在链接时没有找到foo函数的定义,那么foo函数将被设置为NULL。
3. 设置函数为热点函数
```c
void hot_func() __attribute__((hot));
```
这里使用了hot属性,将hot_func函数设置为热点函数。热点函数是指在程序中被频繁调用的函数,使用hot属性可以让编译器对这些函数进行优化,提高程序的性能。
c语言中__attribute__ ((constructor))的作用
__attribute__ ((constructor)) 是C语言中的一个特殊属性,用于指定一个函数在程序运行时的初始化阶段被自动调用。具体而言,当程序加载时,具有该属性的函数会在 main 函数执行之前被自动调用。
这个特性通常用于执行一些全局初始化操作,例如初始化全局变量、打开文件、建立连接等。通过将函数标记为构造函数,可以确保它们在程序运行之前被自动调用。
需要注意的是,具有 __attribute__ ((constructor)) 属性的函数没有参数和返回值,并且不能手动调用。它们是在编译器和链接器级别被处理和调用的。
以下是一个简单的示例:
```c
#include <stdio.h>
void my_constructor(void) __attribute__ ((constructor));
void my_constructor(void) {
printf("Constructor called!\n");
}
int main() {
printf("Main function\n");
return 0;
}
```
在这个示例中,my_constructor 函数被标记为构造函数。当程序运行时,它会在 main 函数之前自动被调用,并输出 "Constructor called!"。然后,main 函数会执行并输出 "Main function"。
总结起来,__attribute__ ((constructor)) 的作用是指定一个函数在程序加载时自动被调用,用于执行一些全局初始化操作。
阅读全文