再问placement new问题,大家都来指教一下
关于placement new再深入的问题:
---------------
前段事件,我问过关于placement new的问题,一位仁兄讲了一些道理,他说道:
::栈上的对象(注意,是类对象,char类型就无需了,后面还会提到)保证放在对齐地址上.
但是,个人实验了一下,发现并不是这样
例如:
int main()
{
char c1 = 'A ' ;
char c2 = 'B ' ;
char c3 = 'C ' ;
char c4 = 'D ' ;
char c5 = 'E ' ;
//-------- 验证这四个地址是否是 4 的倍数 --------------//
if ( ((int)(&c1)) % 4 == 0 )
cout < < "c1:Yes " < < endl ;
if ( ((int)(&c2)) % 4 == 0 )
cout < < "c2:Yes " < < endl ;
if ( ((int)(&c3)) % 4 == 0 )
cout < < "c3:Yes " < < endl ;
if ( ((int)(&c4)) % 4 == 0 )
cout < < "c4:Yes " < < endl ;
if ( ((int)(&c5)) % 4 == 0 )
cout < < "c5:Yes " < < endl ;
cout < < (int)(&c1) < < endl // 输出四个字符所在的地址(输出结果都是 4 的倍数)
< < (int)(&c2) < < endl
< < (int)(&c3) < < endl
< < (int)(&c4) < < endl
< < (int)(&c5) < < endl ;
}
-----------------------------
上面的执行结果在VC下运行都是 4 的倍数
--------------
--> 问题1:连栈上分配的空间地址都是 4 的倍数,那就说明系统分配的空间都是 4 的倍数吧???
--> 问题2:如果万一,如果放一个对象的地址不是4的倍数,那么会出现什么情况??可以给简单说一下吗?
--> 问题3:地址对齐的通用性???
-------------
程序1:
Class C1
{
int i ;
char c ;
} ;
cout < < sizeof(C1) < < endl ;// 输出结果: 8 (是 4 的倍数)
程序2:
class C2
{
char c1 ;
char c2 ;
} ;
cout < < sizeof(C2) < < endl ;// 输出结果:2 ( 上一个中char类型也给了4个字节,怎么这个地方都给了一个字节??)
--> 问题4:由上面的程序2 引出下面的程序
class C2// sizeof(C2) =2 ,在VC实验下的结果,不是 4
{
char c1 ;
char c2 ;
} ;
//----------用placement new方法建立对象----------------
void *ptr = operator new(100) ;// 分配内存
C2 *POINTER = (C2*)ptr ;// 类型转换
String *str1 = new (POINTER) C2() ;// 建立一C2对象
String *str2 = new (POINTER+1) C2() ;// 再建立一个对象
String *str3 = new (POINTER+2) C2() ;// 再建立一个对象
cout < < (int)(str1) < < endl// 结果:3608720( 是4的倍数)
< < (int)(str2) < < endl // 结果:3608722(不是4的倍数)!!
< < (int)(str3) < < endl ;// 结果:3608724(不是4的倍数)!!
[解决办法]
对齐问题,没看出和placement new有什么关系。
String *str2 = new (POINTER+1) C2() ; // 再建立一个对象
返回的就是new参数,也就是POINTER+1。
[解决办法]
一般来说对class对象分配的内存是最大成员的整数倍
[解决办法]
好象是蚂蚁终结者说的样子
class/struct分配内存都是最大成员的倍数.里面还有个合并的意思
比如
struct Point
{
char i;
char t;
int a;
};
sizeof(struct Point) = 4;
而
struct Point2
{
char i;
int a;
char t;
};
sizeof(struct Point2) = 12;
[解决办法]
非常同意楼上的