Re: [問題] struct alignment
有鑑於許多板友沒有進入狀況,我快速科普一下 structure alignment。
畢竟我不是C/C++的專家,以下內容很可能有疏漏之處,還請各位小心服用。
-----
[structure alignment]
C語言自古以來就有的經典性質!
struct裡面的資料,在記憶體當中,必定按照順序排列,而且必定相鄰排列。
struct Node {
char a;
short b;
int c;
};
以上例來說,記憶體的配置一定是abc。不是cba,也不是acb,不會換位置。
這個性質的好處:
1. 使用指標,使用加法,可以指到abc。
2. memcpy可以一口氣拷貝一整個struct。
3. 在記憶體中是連續的,方便debug。
-----
[structure padding]
abc中間可能有間隙。
char: 1 byte short: 2 byte int: 4 byte (或者 int8_t int16_t int32_t)
char可以配置在記憶體任何地方。
short的起始位置只能配置在0 2 4 6 8...
int的起始位置只能配置在0 4 8 12 16...
所以 abc 中間其實有間隙。
a 後面會自動補上 1 byte ,以便讓 b 的起始位置變得正確。
sizeof(Node) 是 1+(1)+2+4 = 8 而不是 1+2+4 = 7
-----
[structure packing]
我們可以強制讓 abc 緊密排列,甚至重新指定 abc 個別的 bit 數量。
這裡就不展開了。
-----
[struct = class]
C++當中,這兩個關鍵字是等價的。
只有一點差別:struct預設public,class預設private。
也請注意:C的struct、C++的struct,是兩碼子事。C++的struct比較強大。
-----
[standard-layout type]
C++11的新性質。
當一個物件型態符合此屬性,就具備C語言 structure alignment 的性質。
is_standard_layout<T>() 可以用來判斷一個物件型態是不是 standard-layout type。
#include <iostream>
struct RGB {
unsigned char r;
unsigned char g;
unsigned char b;
};
struct RGBA : RGB {
unsigned char a;
};
int main()
{
std::cout << std::boolalpha;
std::cout << std::is_standard_layout<RGB>::value << '\n'; // true
std::cout << std::is_standard_layout<RGBA>::value << '\n'; // false
return 0;
}
我說能不能通融一下,希望C++20可以把這個改成true。 XD
-----
[alignment requirement]
C++11的新性質。
alignas 可以重新指定 abc 的bit數量。
alignof 可以計算 abc 的配置位置。
這裡就不展開了。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.225.37.97 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1576366351.A.A4A.html
※ 編輯: DJWS (36.225.37.97 臺灣), 12/15/2019 07:45:48
※ 編輯: DJWS (36.225.37.97 臺灣), 12/15/2019 07:49:41
推
12/15 12:36,
5年前
, 1F
12/15 12:36, 1F
→
12/15 16:40,
5年前
, 2F
12/15 16:40, 2F
→
12/15 16:41,
5年前
, 3F
12/15 16:41, 3F
→
12/15 16:42,
5年前
, 4F
12/15 16:42, 4F
→
12/15 17:44,
5年前
, 5F
12/15 17:44, 5F
推
12/15 18:41,
5年前
, 6F
12/15 18:41, 6F
→
12/15 19:49,
5年前
, 7F
12/15 19:49, 7F
噓
12/17 10:23,
5年前
, 8F
12/17 10:23, 8F
其實我不喜歡釣魚。為了避免更多無辜民眾上鉤,我還是澄清一下吧。
[問題] 因數分解問題請教
https://www.pttweb.cc/bbs/C_and_CPP/M.1359553751.A.294
loveme00835 之前發現那個站很多都是演算法筆記抄來的就不逛了 01/30 22:10, 3F
DJWS 三樓可能搞反了 演算法筆記還沒出現以前 這個站就已經在了 01/31 13:16, 10F
loveme00835 我指的是內容, 而且是指 C/C++ 的程式碼 01/31 14:06, 11F
此人以前就會憑空誣陷別人,被指正還不認錯,繼續鬼扯。
一句話挑戰台灣兩個知名教學網站,根本戰神,板主你確定要挺這種人?
置底閒聊文(2016/7/2-
https://www.pttweb.cc/bbs/C_and_CPP/M.1467445964.A.4DF
近期活動:
- DJWS大神降臨!快帶老婆來朝聖
Richun 老婆? 07/02 19:38, 2F
wtchen 再怎麼不濟也有雙手吧 07/02 20:16, 3F
板主你所謂的語氣好,就是問候人家老婆或者雙手?
而我就對方言論提出我的疑問、提出我的見解,就是語氣不好?
我從頭到尾只有嚴厲批評s板友,因為他從struct alignment扯到OO去。
至於其他板友,我都相當尊重,有問必答,我自認說話沒有語氣不好,請板主明鑑。
※ 編輯: DJWS (114.45.86.151 臺灣), 12/17/2019 18:54:21
推
12/17 21:13,
5年前
, 9F
12/17 21:13, 9F
噓
12/17 22:26,
5年前
, 10F
12/17 22:26, 10F
推
12/17 22:39,
5年前
, 11F
12/17 22:39, 11F
噓
12/17 23:27,
5年前
, 12F
12/17 23:27, 12F
→
12/17 23:30,
5年前
, 13F
12/17 23:30, 13F
→
12/17 23:34,
5年前
, 14F
12/17 23:34, 14F
→
12/17 23:34,
5年前
, 15F
12/17 23:34, 15F
→
12/17 23:37,
5年前
, 16F
12/17 23:37, 16F
推
12/18 00:04,
5年前
, 17F
12/18 00:04, 17F
噓
12/18 05:34,
5年前
, 18F
12/18 05:34, 18F
噓
12/18 05:34,
5年前
, 19F
12/18 05:34, 19F
噓
12/18 06:59,
5年前
, 20F
12/18 06:59, 20F
推
12/18 12:53,
5年前
, 21F
12/18 12:53, 21F
→
12/18 12:53,
5年前
, 22F
12/18 12:53, 22F
→
12/18 12:53,
5年前
, 23F
12/18 12:53, 23F
→
12/18 12:53,
5年前
, 24F
12/18 12:53, 24F
→
12/18 12:53,
5年前
, 25F
12/18 12:53, 25F
噓
12/18 18:24,
5年前
, 26F
12/18 18:24, 26F
推
12/19 13:00,
5年前
, 27F
12/19 13:00, 27F
推
12/19 13:07,
5年前
, 28F
12/19 13:07, 28F
→
12/19 13:09,
5年前
, 29F
12/19 13:09, 29F
推
12/19 14:50,
5年前
, 30F
12/19 14:50, 30F
推
12/20 05:51,
5年前
, 31F
12/20 05:51, 31F
→
12/20 05:51,
5年前
, 32F
12/20 05:51, 32F
→
01/03 17:35,
5年前
, 33F
01/03 17:35, 33F
推
03/19 23:28,
5年前
, 34F
03/19 23:28, 34F
→
03/19 23:29,
5年前
, 35F
03/19 23:29, 35F
討論串 (同標題文章)
完整討論串 (本文為第 3 之 4 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章