E作者Ninja5566 (苦味)
看板C_and_CPP
标题[问题] Pointer alignment 问题
时间Thu Mar 2 21:16:05 2017
开发平台(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
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
27F:→ dreamboat66: 这样写 不是说standardlayout是POD的一种吗? 03/03 00:17
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