c语言内存优化的一种方式 #pragma

#pragma 关键字的用法

  #pragma 是一个预处理指令,用于在编译过程中控制编译器的行为。

      当我们在C语言中使用结构体时,内存对齐是一个重要的概念。它确保结构体成员在内存中按照一定的规则排列,以便提高访问效率。

内存空间优化,访问次数优化

  1. 默认的内存对齐方式

    • 默认情况下,C/C++编译器会按照数据类型的自然对齐条件分配内存空间。
    • 在结构体中,成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。
    • 编译器缺省的结构整体的自然对齐条件为:该结构所有成员中要求的最大自然对齐条件。
  2. 使用 #pragma pack 改变对齐方式

    • #pragma pack(n) 指令可以改变编译器的对齐方式,其中 n 表示按照多少字节对齐。
    • 例如,#pragma pack(4) 将设置为4字节对齐。
    • 使用 #pragma pack() 可以取消自定义的字节对齐方式,恢复到默认设置。
    • 这个关键字在一个文件中可以多次使用
  3. 优化CPU寻址的例子

    • 假设我们有以下结构体:
      struct Test {
          char x1;    // char型,自然对齐条件为1字节
          char x2;    // char型,自然对齐条件为1字节
          float x3;   // float型,自然对齐条件为4字节
          char x4;    // char型,自然对齐条件为1字节
      };
      
    • 默认情况下,结构体的自然对齐条件为4字节对齐(因为float型成员x3需要4字节对齐)。
    • 结构体长度为12字节,内存布局为 1100 1111 1000
    • 如果我们使用 #pragma pack(2),结构体的大小将变为8字节,内存布局为 11 11 11 10

#include <stdio.h>  
  
// 测试2字节对齐  
#pragma pack(push, 2)  
struct Test2 {  
    char x1;    // char型,自然对齐条件为1字节  
    char x2;    // char型,自然对齐条件为1字节  
    float x3;   // float型,自然对齐条件为4字节  
    char x4;    // char型,自然对齐条件为1字节  
};  
#pragma pack(pop)  
  
// 测试4字节对齐(通常这是许多系统的默认对齐)  
#pragma pack(push, 4)  
struct Test4 {  
    char x1;    // char型,自然对齐条件为1字节  
    char x2;    // char型,自然对齐条件为1字节  
    float x3;   // float型,自然对齐条件为4字节  
    char x4;    // char型,自然对齐条件为1字节  
};  
#pragma pack(pop)  
  
int main() {  
    printf("Size of Test2 (2-byte aligned): %zu bytes\n", sizeof(struct Test2));  
    printf("Size of Test4 (4-byte aligned): %zu bytes\n", sizeof(struct Test4));  
    return 0;  
}

 其他用法

  1. 警告抑制

    • #pragma warning 可以用来控制编译器警告的显示。
    • 例如,#pragma warning(disable: 1234) 可以禁用特定警告编号为1234的警告。
  2. 优化指令

    • #pragma optimize 可以用于控制编译器的优化级别。
    • 例如,#pragma optimize("O2") 可以设置为优化级别2。
  3. 循环展开

    • #pragma unroll 可以用于控制循环展开。
    • 例如,#pragma unroll(4) 可以指示编译器展开循环4次。
  4. 向量化指令

    • #pragma simd 可以用于启用或禁用向量化。
    • 例如,#pragma simd enable 可以启用向量化。

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值