2017-03-31 51 views
6

閱讀Herb Sutter關於最近C++標準會議的博客文章,它注意到std::byte被添加到C++ 17中。作爲初始閱讀,我有一些擔心,因爲它使用unsigned char,以避免嚴格的別名規則帶來的複雜性。std ::奇怪平臺上的字節

我最關心的是,它在CHAR_BIT不是8的平臺上如何工作?我曾與/平臺CHAR_BIT是16或32(通常是DSP)。鑑於std::byte是爲了處理「面向字節的內存訪問」,並且大多數人理解字節以指示八位字節(而不是基本字符類型的大小),對於期望這將解決連續8大量的內存?

我已經看到人們只是假設CHAR_BIT是8(不知道CHAR_BIT存在...)。一種名爲std::byte的類型可能會給個人帶來更多混亂。


我想,我所期待的是,他們引入一個類型,允許一致的尋址/訪問所有情況下連續字節。有許多面向八位字節的協議,在所有平臺上保證一次訪問一個八位組的內存或類型是有用的,不管在給定平臺上哪個是CHAR_BIT等於。

我完全可以理解,想要明確地指出某些東西被用作字節序列而不是字符序列,但它看起來並不像許多其他事物那樣有用。

+11

就標準而言,一個字節有'CHAR_BIT'位。這就是爲什麼'sizeof(char)'總是1,即使在這些DSP上。 – NathanOliver

+3

那些人需要調整他們的期望。或者,更直白地說,不要錯了。 – molbdnilo

+2

如果您擔心某些人可能會錯誤地使用它,那麼在C++中就是這樣。你有更具體的問題嗎? – Barry

回答

13

鑑於std::byte是處理「內存面向字節的訪問」,而大多數人都明白字節來表示一個字節(不是基本字符類型的大小),這將如何工作,爲個人誰期待這將解決連續的8位內存塊?

你不能理解錯誤,然後期望世界重新排列自己以適應你的期望。

大多數人認爲一個字節和一個八位字節是同一件事的原因是因爲在大多數情況下它是真的。絕大多數典型的電腦都有CHAR_BIT == 8。這並不意味着它一直如此。

  • 一個字節不是八位字節。
  • charsigned charunsigned char具有大小爲一個字節

好的一面是,雖然,人誰不知道,其實誰也不需要知道的人。如果你正在使用一個字節由多個八位字節組成的機器上工作,那麼你就是那種需要比其他任何一個字節更多的開發人員。

如果我們在這裏講理論,那麼答案很簡單:只要知道一個字節與八位字節不同即可。如果我們正在談論具體的東西,那麼答案是你要麼已經知道了差別,要麼你不需要知道它(希望:))。最糟糕的情況是你痛苦地學習了這一點,但這是在沒有外來知識的情況下在異國平臺上工作的第三少數開發人員。


如果你想爲八位組等價物,它已經存在:

注意,他們是「僅供如果實現直接支持的類型」。

+2

然而,那些不是保證爲人們使用的大多數目的而工作。 int8_t不能保證是signed char的別名(或者只是char),所以你不能使用這些別名來避免嚴格的別名違規。 – Graznarak

+1

我同意終極解決方案的用戶明智會像'std :: octet',但這可能幾乎不可能實現在平臺上的最小可用大小超過8位,(16位)。所以對於語言的可移植性原因,我不確定你會有什麼比這更好的任何事情,但我很想錯,但:) – Drax