簡體   English   中英

為什么使用最大的位字段序列定義C ++內存?

[英]Why is the C++ memory defined using a maximal sequence of bit-fields?

最小的存儲單位是一個字節,請參見此處的標准引號

C ++內存模型中的基本存儲單元是字節。

但是隨后將一個存儲位置定義為可能是相鄰的位字段:

存儲器位置是標量類型的對象,或者是全部具有非零寬度的相鄰位域的最大序列。

我想了解這個定義:

  • 如果最小的存儲單元是一個字節,為什么我們不將存儲位置定義為字節序列?
  • C樣式位域如何與第一句完全吻合?
  • 最大序列點是什么; 這里最大是多少?
  • 如果在內存的定義中有位域,為什么還需要其他內容? 例如,float或int都由位組成,因此“標量類型的對象” -part似乎是多余的。

您可以通過以下語句來推斷某些原因:“兩個或多個執行線程可以訪問單獨的內存位置,而不會互相干擾。”

即兩個線程不能訪問對象的單獨字節 並且訪問相鄰位域的兩個線程也可能相互干擾。

此處的最大序列是因為該標准未確切指定如何將位域序列映射到字節,然后可以獨立訪問這些字節中的哪個字節。 在這方面的實現方式可能會有所不同。 但是, 最大的位域序列是任何實現可以整體分配的最長序列。 特別是, 最大序列以寬度為0的btfield結尾。下一個位域開始一個新序列。

雖然整數和浮點數由位組成,但是C和C ++中的“位域”專門指“整數類型的對象成員,其寬度單位明確指定”。 不是所有由位組成的東西都是位域。

讓我們分析一下這些術語:

以供參考:

http://en.cppreference.com/w/cpp/language/bit_field http://en.cppreference.com/w/cpp/language/memory_model

字節

如您所說,內存中(通常)8位的最小單位,可使用內存地址顯式尋址。

位字段

帶有明確位數的BITS序列!

記憶體位置

字節倍數類型OR(!!!)的每個單個地址都是非零大小的連續位字段序列的開頭。

你的問題 ##

讓我們以cpp-reference示例為例,並多加一些贊美,並一步一步地回答您的問題:

struct S {
    char a;     // memory location #1, 8-bit character, no sequence, see missing :#, scalar-type.
    int b : 5;  // memory location #2, new sequence, new location, integer-type of 5-bits length
    int c : 11, // memory location #2 (continued) integer-type of 11-bits length
          : 0,  // (continued but ending!) IMPORTANT: zero-size-bitfield, sequence ends here!!!
        d : 8;  // memory location #3 integer-type 8-bit, starts a new bit-field sequence, thus, new memory-location
    struct {
        int ee : 8; // memory location #4
    } e;
} obj; // The object 'obj' consists of 4 separate memory locations
  • 如果最小的存儲單元是一個字節,為什么我們不將存儲位置定義為字節序列?

也許我們希望對給定的系統類型(例如7位整數或4位char)進行細粒度的內存消耗位級控制。...一個字節作為單位的聖杯會否定我們自由

  • C樣式位域如何與第一句完全吻合?

實際上,由於位域功能起源於C ...這里重要的是,即使您使用位域定義結構,例如僅消耗11位,第一個位也將在內存中按字節對齊,即具有一個與8位步長對齊的位置,並且數據類型最終將占用至少(!)16位,以保存位字段...存儲數據的確切方法至少是在C語言中而不是標准化的afaik中。

  • 最大序列的意義是什么? 這里最大是多少?

最大序列的目的是允許對各個字段進行有效的內存對齊,編譯器優化……在這種情況下,最大意味着所有大小大於等於1的序列中聲明的所有位域,即沒有其他標量類型,也沒有帶':0的位域“

  • 如果在內存的定義中有位域,為什么還需要其他內容? 例如,float和int都由位組成,因此“標量類型的對象”部分似乎是多余的。

不,它們都是由位組成的,但是:如果不指定類型的位大小,將使編譯器采用默認大小,即int:32位...如果不需要那么大的整數分辨率值,但例如僅24bit,則寫入unsigned int v:24 ,...

當然,寫東西的非位域方式可以用位域表示,例如:

int a,
int b : 32 // should be equal to a

但是(我不知道,這里有隊長嗎?)

如果系統定義的默認類型為T的默認值為n位,並且您編寫類似以下內容:

T value : m // m > n

我不知道結果是什么...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM