• C 语言的 GCC 扩展


    GNU 编译器(GCC)提供了很多 C 语言扩展,编译器会使用该信息生成更高效的机器代码。

    内联函数

    static inline __attribute__ ((always_inline)) int foo(void) { /* ... */ }


    避免内联

    __attribute__ ((noinline)) int foo(void) { /*...*/ }


    纯函数

    __attribute__ ((pure)) int foo(int val) { /* */ }

    返回值只受函数参数或 nonvolatile 全局变量影响。

    常函数

    __attribute__ ((const)) int foo(int val) { /*...*/ }

    常函数是一种严格的纯函数。常函数不能访问全局变量,参数不能是指针类型。因此,常函数的返回值只和值传递的参数值有关。

    没有返回值的函数

    __attribute__ ((noreturn)) void foo(int val) { /*...*/ }

    分配内存的函数

    __attribute__ ((malloc)) void *copy()
    {
       int size = 10;
       return malloc(10);
    }

    强制调用方检查返回值

     1 #include <stdio.h>
     2 
     3 __attribute__ ((warn_unused_result)) int foo()
     4 {
     5     return 0;
     6 }
     7 
     8 int main()
     9 {
    10     foo();
    11     return 0;
    12 }


    把函数标识为“Deprecated(已废弃)”

    __attribute__ ((deprecated)) void foo(void) { /*...*/ }


    把函数标识为已使用

    static __attribute__ ((used)) void foo(void) { /*...*/ }


    把函数或参数标识为未使用的

    int foo(int __attribute__ ((unused)) value) { /*...*/}


    对结构体进行紧凑存储(pack)

    struct __attribute__ ((packed)) foo { ... };

    packed 属性告诉编译器一个类型或变量应该在内存中紧凑存储,使用尽可能少的空间,可能不依赖对齐需求。如果在结构体(struct)或联合体(union)上指定该属性,就需要对所有变量进行紧凑存储。如果只是对某个变量指定该属性,就只会紧凑存储该特定变量。

  • 相关阅读:
    docker pull配置代理方法
    docker配合ssh管道跨主机传输镜像
    Java面向对象详解
    云服务器的公网IP和内网IP的区别
    开启 kubectl 命令的自动补全功能
    Vue+Openlayers实现绘制线段并测量距离显示
    Vue+Openlayers+elradio实现切换地图显示
    koa使用swagger自动生成接口文档
    什么是低代码
    前后端统一接口的响应参数数据结构
  • 原文地址:https://www.cnblogs.com/jingyg/p/5398476.html
Copyright © 2020-2023  润新知