笔记——__attribute__、inline、section

来自gpt

目录

__attribute__

inline

section


__attribute__

在C语言中,__attribute__是一种扩展特性(attribute),用于向编译器提供额外的信息或指令,以改变编译器对代码的行为或生成的代码的属性。

__attribute__的一般语法如下:

__attribute__((attribute-list))

其中,attribute-list是一个逗号分隔的属性列表,可以包含一个或多个属性。

以下是一些常见的使用场景和示例:

  • 用于声明变量属性:您可以使用__attribute__来指定变量的某些属性,例如对齐方式、存储类型等。

int my_variable __attribute__((aligned(64)));

上述示例将my_variable变量的对齐方式设置为64字节对齐。

  • 用于声明函数属性:您可以使用__attribute__来指定函数的某些属性,例如内联函数、格式化字符串检查等。

void my_function() __attribute__((always_inline));
  • 用于声明类型属性:__attribute__可以用于指定某些类型的属性,例如结构体的对齐方式。
struct my_struct {
    int x;
    int y;
} __attribute__((packed));

上述示例将my_struct结构体声明为紧凑型,取消了默认的对齐。

__attribute__是编译器特定的语法,不同的编译器可能支持不同的属性。因此,在使用__attribute__时应谨慎,确保了解目标编译器的文档和规范。

需要注意的是,__attribute__是C语言的扩展特性,并不属于C标准的一部分。这意味着它在不同的编译器和平台上的行为可能会有所不同。

#define LV_MEM_ATTR __attribute__((section(".ccmram")))

这句代码是什么意思

这句代码是一个宏定义,用于给变量或函数添加属性(attribute)。具体来说,它定义了一个名为LV_MEM_ATTR的宏,该宏使用了 GCC 编译器的特性来将变量或函数放置在指定的内存区域(.ccmram)。

通常情况下,变量和函数被放置在默认的内存区域中。但是,有时候我们需要将特定的变量或函数放置在其他内存区域中,例如一些特殊的 RAM 区域,用于实现特定的功能或优化性能。

__attribute__是 GCC 编译器提供的一种语法扩展,允许程序员在声明变量或函数时提供某些特殊的属性。在这个宏中,section(".ccmram") 是一个属性,它告诉编译器将变量或函数放置在名为 ".ccmram" 的内存段中。

例如,下面是使用 LV_MEM_ATTR 宏的示例:

int LV_MEM_ATTR myVariable; // 将 myVariable 变量放置在 .ccmram 内存段

或者:

LV_MEM_ATTR void myFunction() { // 在此处实现函数的代码 }

通过使用这个宏,我们可以将相关的变量或函数放置在指定的内存段中,从而实现对内存布局的精确控制。请注意,这个宏的定义在不同的编译器或工具链中可能会有所差异,因此需要根据具体的工具链和编译器文档来了解使用细节。

inline

在C语言中,inline是一个关键字,用于建议编译器将函数展开为内联函数。内联函数是一种优化技术,它可以减少函数调用的开销,提高程序的执行效率。

通常情况下,当程序中调用一个函数时,程序会跳转到函数的代码块执行,并在函数执行完后再返回到调用点。这涉及到函数调用的过程,包括保存和恢复寄存器、跳转等操作,会有一定的开销。

而使用inline关键字可以要求编译器将函数的代码直接嵌入到调用点处,而不进行函数调用。这样可以避免函数调用的开销,提高程序的执行速度。

以下是一个示例:

inline int add(int a, int b) 
{ 
    return a + b; 
} 

int main() 
{ 
    int result = add(3, 4); 
    // ... 
    return 0; 
}

在上述示例中,函数add被声明为内联函数。当add函数被调用时,编译器会尽可能地将函数的代码嵌入到调用点处,而不是进行函数调用。

需要注意的是,inline仅仅是对编译器的建议,编译器不一定会采纳这个建议。编译器可能会根据自身的优化策略和限制条件来决定是否将函数展开为内联函数。

此外,inline关键字一般需要和函数定义放在同一个头文件中,以便编译器能够在调用点处直接展开函数的代码。如果函数定义和调用不在同一个源文件中,编译器可能无法找到函数的定义,从而无法进行内联展开。

总而言之,使用inline关键字可以对编译器提供内联函数的建议,以减少函数调用的开销并提高程序性能。但是具体是否内联展开由编译器决定。

section

在 C 语言中,section 是一个关键字,用于将变量或函数放置在指定的内存段中。它是 GCC 编译器提供的一种语法扩展,允许程序员对程序的内存布局进行更细粒度的控制。

使用 section 关键字,程序员可以将某个变量或函数指定为位于一个特定的内存段中,从而实现对内存布局的精确控制。例如:

int myVar __attribute__((section(".mysection")));

上述代码将一个名为 myVarint 类型的变量放置在一个名为 .mysection 的内存段中。使用 __attribute__ 关键字可以指定一个或多个属性,其中包括 section 属性。

需要注意的是,section 关键字只是 GCC 编译器的一个语法扩展,不是 C 语言标准中的一部分。因此,在使用 section 关键字时要注意编译器和工具链的版本和兼容性,以及可能的平台依赖性和可移植性问题。

猜你喜欢

转载自blog.csdn.net/weixin_63096487/article/details/133960637
今日推荐