C_and_CPP 板


LINE

开发平台(Platform): (Ex: Win10, Linux, ...) Win10 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出) VC++ 额外使用到的函数库(Library Used): (Ex: OpenGL, ...) 问题(Question): 假设我今天有一个class 长这样: class A{ int a; int b; int c; public: void Init( int x, int y, int z ){ a = x; b = y; c = z; } }; 如果他size是12 byte, 我想做以下事情, 请问是否合法? ( 我知道有palcement new, 但出於某些原因我无法用 ) 撇开效能问题, 这样执行是否会有问题? 1. char myPool[ 1024 ]; A* pA = ( A* ) ( &myPool[ 0 ] ); pA->Init( 1, 2, 3 ); 2. char myPool[ 1024 ]; A* pA = ( A* ) ( &myPool[ 1 ] ); pA->Init( 1, 2, 3 ); 3.如果要align pA, pA应该要align 4 还是 12? 感谢回答 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 24.92.128.112
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1488460567.A.085.html ※ 编辑: Ninja5566 (24.92.128.112), 03/02/2017 21:16:32
1F:推 james732: 对class做这种事情好像有点危险? 03/02 21:19
2F:→ johnjohnlin: 3. 不能 align non power of 2 的样子 03/02 21:51
3F:推 ilikekotomi: VC++的debug有memory window 进debug看最准 03/02 21:56
4F:→ bluesoul: align 12 03/02 22:02
5F:→ Ninja5566: 我有跑过并且可执行, 但我不知道这样做是不是合法的 03/02 22:03
6F:→ bluesoul: OK的 03/02 22:07
7F:→ johnjohnlin: http://en.cppreference.com/w/cpp/language/object 03/02 22:14
8F:→ final01: 这将来出问题看你怎麽debug XD 03/02 22:15
请问为什麽不能debug?
9F:→ johnjohnlin: alignment is an integer value always a power of 2 03/02 22:15
10F:→ johnjohnlin: 我应该没记错吧 03/02 22:15
那请问array of A会对齐多少? ※ 编辑: Ninja5566 (24.92.128.112), 03/02/2017 22:18:07
11F:推 lvpcxxqq: A[10],每个都对齐12 03/02 22:24
12F:→ bluesoul: alignment会是std::size_t的倍数,power of 2应该是形容 03/02 22:28
13F:→ bluesoul: std::size_t的大小 03/02 22:28
14F:→ bluesoul: 为何不宣告A阵列 03/02 23:21
15F:→ Ninja5566: 因为我要作 memory pool 03/02 23:31
16F:推 lovejomi: 借问,用placement new难道就不用考虑alighnment吗? 03/02 23:36
17F:推 LPH66: placement new 只是把"要空间"跟"初始化"两件事分开而已 03/03 00:03
18F:→ LPH66: alignment 是"要空间"部份旳问题, 跟初始化无关 03/03 00:03
所以C++ 保证只要空间足够, 就可以直接对pointer 初始化操作吗? 还是必须要standard layout?
19F:→ LPH66: 然後事实上 pA->Init() 跟 placement new 其实有 87% 像 03/03 00:04
20F:→ LPH66: 最後, 问於一楼的问题, 如果 class 是 standard layout 03/03 00:06
21F:→ LPH66: 那各元素的位置是确定的, 这时可以做一些手脚去达到对齐 03/03 00:07
可以做一些手脚达到对齐 ->请问这句话是甚麽意思?
22F:→ LPH66: 不是 standard layout 基本上就不行了 03/03 00:07
23F:推 dreamboat66: standard layout 是 POD的某一个条件吗? 03/03 00:10
24F:→ LPH66: 倒过来, POD 是 standard layout 的一种 03/03 00:11
25F:→ LPH66: 但 standard layout 可以包含一些有限度的继承 03/03 00:12
26F:推 dreamboat66: http://en.cppreference.com/w/cpp/concept/PODType 03/03 00:17
27F:→ dreamboat66: 这样写 不是说standardlayout是POD的一种吗? 03/03 00:17
28F:→ dreamboat66: http://ideone.com/sWh0je 测一下 有继承也是POD? 03/03 00:20
29F:→ LPH66: 喔, 那里框框中那三行是 and 的关系, 不是 or 的 03/03 00:20
※ 编辑: Ninja5566 (140.254.77.191), 03/03/2017 00:22:28 ※ 编辑: Ninja5566 (140.254.77.191), 03/03/2017 00:23:52 ※ 编辑: Ninja5566 (140.254.77.191), 03/03/2017 00:27:37
30F:推 LPH66: placement new 是对任何 C++ 物件型态都能进行的操作 03/03 00:29
31F:→ LPH66: 它就只是把你给的指标当做物件未来的所在地进行初始化而已 03/03 00:30
32F:→ Ninja5566: 那standard layout的条件可以做到额外甚麽事情? 03/03 00:32
33F:→ LPH66: 所以我才会说这跟你的 pA->Init() 有 87% 像 03/03 00:32
34F:→ LPH66: standard layout 最大的好处是成员位置固定 03/03 00:33
35F:→ LPH66: 因此可以拿来当做一些二进位资料交换的用途 03/03 00:33
36F:→ LPH66: 那也因为位置固定, 所以只要知道想要对齐的成员是怎麽排的 03/03 00:34
37F:→ Ninja5566: 像是serialization? 03/03 00:34
38F:→ LPH66: 就能调整开始位置使得其成员处在对齐的位置上 03/03 00:34
※ 编辑: Ninja5566 (140.254.77.191), 03/03/2017 00:34:59
39F:→ LPH66: serialization 是另一回事了, 这里指的是整包写出去那种 03/03 00:35
40F:→ LPH66: 例如二进位档案格式那样 03/03 00:35
41F:→ Ninja5566: 所以standard layout 保证成员变数的memory layout? 03/03 00:45
42F:推 LPH66: 对, 这也是为什麽 offsetof() 可以用在 standard layout 上 03/03 00:56
43F:→ LPH66: (或者该说「只能用在 standard layout 上」) 03/03 00:57
44F:→ Ninja5566: 感谢解答!! 03/03 01:02
但是在这连结中却说这是 undefined behavior? https://tinyurl.com/j4atmr8 [14] Note: when the allocation function returns a value other than null, it must be a pointer to a block of storage in which space for the object has been reserved. The block of storage is assumed to be appropriately aligned and of the requested size. 请问这里讲的是对的吗? 又. 我测试发现 std::alignment< A >::value = 4 所以只要对齐4就好? https://tinyurl.com/pqkgqnh Inorder to avoid such misalignment, compiler will introduce alignment requirement to every structure. It will be as that of the largest member of the structure. In our case alignment of structa_t is 2, structb_t is 4 and structc_t is 8. If we need nested structures, the size of largest inner structure will be the alignment of immediate larger structure. ※ 编辑: Ninja5566 (24.92.128.112), 03/03/2017 03:41:43
45F:推 Sidney0503: 请用struct与offsetof 03/03 10:03
※ 编辑: Ninja5566 (24.92.128.112), 03/03/2017 21:00:05 ※ 编辑: Ninja5566 (24.92.128.112), 03/03/2017 21:10:51
46F:→ w0005151: 没人跟我一样觉得"副程式"这个称呼很classic吗 03/07 22:08
47F:→ w0005151: 不小心耍脑推错篇= = 03/07 22:09







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP