C 預處理與記憶體對齊

2021-07-06 06:09:08 字數 1716 閱讀 1699

巨集表示式與汗水的對比

一些你應該知道的強大的內建巨集

-> 例如: #define log(s) printf(「%s : %d %s 「,file,line, s);

條件編譯

-> 如何避免嵌入相同的檔案呢? 範例:

#ifndef _global_h

#define _global_h

int global = 0;

#endif

相信上面的**, 你已經見過了, 是不是可以理解呢?
- #error與#warning、#line

- #error用於生成乙個編譯錯誤訊息,並停止編譯 -> 即程式的預處理都不會完成

- #error用於定義預處理不正確的錯誤

- #warning用於生成編譯器警告,但不會停止編譯

- #line用於強制指定新的行號和編譯檔名,並對源程式的**重新編號

- #line的本質是重定義fileline

-> 範例:
log("demo");

#ifndef command

#warning complication will be stop

#error no defined constant symbol command

#endif

#line 20 "hello.c"

log("#line 起作用了嗎?");

可以看出, #error  message  : message並不需要加雙引號。
在看這個指令之前,先來看一下,什麼是記憶體對齊?

不同型別的資料在記憶體中按照一定規則排列; 而不是順序的乙個接乙個排放,這就是記憶體對齊。

struct test1;

struct test2;

printf("test1's size is %d:", sizeof(struct test1)); //12

printf("test2's size is %d:", sizeof(struct test2)); //8

結果為什麼是這樣呢? 來看一下記憶體對齊的規則:

- 1,對於結構體的各成員,第乙個成員位於偏移0的位置,以後每個資料的偏移量必須是 min(#pragma pack()指定的數, 這個資料成員的自身長度)的倍數。

- 2,在資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構體(或聯合)最大資料成員長度中, 比較小的呢個進行

- 3, #pragma pack 的預設值為4

-> 我們可的:

-  在對齊過程中起始偏移 : 必須是 min(#pragma pack()指定的數, 這個資料成員的自身長度)的倍數

- 最後整個結構體的大小必須是 : #pragma pack指定的數值和結構體(或聯合)最大資料成員長度中, 比較小的呢個的倍數

C 下記憶體對齊 與 對齊控制

背景 在任務中遇到了由於記憶體對齊引起的乙個double資料讀取錯誤問題,排查很久才發現偏移位址跑了4位。記憶體對齊知識整理 1 乙個對齊的例子 struct struct1 2 記憶體對齊的好處 簡單來說,是為了提高處理器對於資料的處理效率。這裡涉及乙個概念 cpu的記憶體訪問粒度。目前的訪問粒度...

結構體對齊預處理指令

方式一 n可以取以下5個數中的任意乙個 1,2,4,8,16 來自定義結構體成員的對齊方式 pragma pack n 這裡放置結構體 pragma pack 取消自定義位元組對齊方式方式二 n可以取以下5個數中的任意乙個 1,2,4,8,16 來自定義結構體成員的對齊方式 pragma pack ...

記憶體管理 預處理與結構體

1.未初始化的全域性變數 bss段 用來存放那些沒有初始化和初始化為零的全域性變數。2.初始化過的全域性變數 data 裡面存放那些初始化為非零的全域性變數。3.常量資料 rodata段 ro代表ready only,rodata就是用來存放常量資料的。在多個程序是共享的,這樣可以提高執行空間利用率...