Re: [問題] struct alignment

看板C_and_CPP作者 (...)時間4年前 (2019/12/15 07:32), 4年前編輯推噓4(11717)
留言35則, 18人參與, 5年前最新討論串3/4 (看更多)
有鑑於許多板友沒有進入狀況,我快速科普一下 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, 4年前 , 1F
大家都知道這些,但是都沒有進入狀況 XD
12/15 12:36, 1F

12/15 16:40, 4年前 , 2F
結果有進入狀況的原 PO 還少最重要的關鍵字:
12/15 16:40, 2F

12/15 16:41, 4年前 , 3F
layout-compatible. 頗呵
12/15 16:41, 3F

12/15 16:42, 4年前 , 4F
全世界你最懂
12/15 16:42, 4F

12/15 17:44, 4年前 , 5F
板上神人其實很多,一山還有一山高,原Po注意一下語氣
12/15 17:44, 5F

12/15 18:41, 4年前 , 6F
原po不就常常因為這樣,然後...
12/15 18:41, 6F

12/15 19:49, 4年前 , 7F
layout-compatible我真不會 各位可以詳細說說嗎?
12/15 19:49, 7F

12/17 10:23, 4年前 , 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, 4年前 , 9F
路人覺得態度很差是真的啊
12/17 21:13, 9F

12/17 22:26, 4年前 , 10F
12/17 22:26, 10F

12/17 22:39, 4年前 , 11F
你不是在軟工板酸cpp板程度嗎 我還有點印象
12/17 22:39, 11F

12/17 23:27, 4年前 , 12F
路人覺得態度差+1
12/17 23:27, 12F

12/17 23:30, 4年前 , 13F
舉的案例邏輯一蹋糊塗
12/17 23:30, 13F

12/17 23:34, 4年前 , 14F
要嗆人就嗆到底,嘴巴不饒人又不敢承認,這我不行
12/17 23:34, 14F

12/17 23:34, 4年前 , 15F

12/17 23:37, 4年前 , 16F
對了,我也只是嚴厲批評,因為你從程式扯到其他舊文去
12/17 23:37, 16F

12/18 00:04, 4年前 , 17F
其實我還是看不懂原文在說什麼QQ
12/18 00:04, 17F

12/18 05:34, 4年前 , 18F
那篇本來就是閒聊文,閒聊就是給人這樣用的。老兄你口氣不
12/18 05:34, 18F

12/18 05:34, 4年前 , 19F
改善的話我們就板規處置
12/18 05:34, 19F

12/18 06:59, 4年前 , 20F
殺洨
12/18 06:59, 20F

12/18 12:53, 4年前 , 21F
我從一開始就看這串的,平心而論真的看不出原Po尊重在哪
12/18 12:53, 21F

12/18 12:53, 4年前 , 22F
只看到明明是來問問題的又愛跟人爭輸贏
12/18 12:53, 22F

12/18 12:53, 4年前 , 23F
我還看到版友給的建議你不只不懂得利用,還說人家是上古
12/18 12:53, 23F

12/18 12:53, 4年前 , 24F
時代、不切實際 = =
12/18 12:53, 24F

12/18 12:53, 4年前 , 25F
看到真的超級傻眼好嗎
12/18 12:53, 25F

12/18 18:24, 4年前 , 26F
蛤??
12/18 18:24, 26F

12/19 13:00, 4年前 , 27F
我覺得是中文不好的問題。問問題問成那樣再批評人家離題
12/19 13:00, 27F

12/19 13:07, 4年前 , 28F
然後不要覺得這裡沒人看 Soft_job 好嗎 XD
12/19 13:07, 28F

12/19 13:09, 4年前 , 29F
虧我還有在阿輪的文底下推文
12/19 13:09, 29F

12/19 14:50, 4年前 , 30F
為啥你覺得版友不懂這些XD
12/19 14:50, 30F

12/20 05:51, 4年前 , 31F
各位給點尊重好嗎?這位是演算法筆記的作者,競賽的無
12/20 05:51, 31F

12/20 05:51, 4年前 , 32F
冕王者
12/20 05:51, 32F

01/03 17:35, 5年前 , 33F
一直活在自己的象牙塔裡,真實世界的可憐人。
01/03 17:35, 33F

03/19 23:28, 5年前 , 34F
寫c++還用struct? ...
03/19 23:28, 34F

03/19 23:29, 5年前 , 35F
面試看到這問題都發笑
03/19 23:29, 35F
文章代碼(AID): #1TzN4FfA (C_and_CPP)
文章代碼(AID): #1TzN4FfA (C_and_CPP)