有没有办法保留传递给placement new的缓冲区的原始值?示例代码:
struct MyStruct {
int number;
char bytes[100];
} __attribute__ ((packed));
char data[sizeof(MyStruct)]; // contains value received via TCP
MyStruct* create_struct_a() {
char tmp[sizeof(MyStruct)];
memcpy(tmp, data, sizeof(MyStruct));
MyStruct* result = new (data) MyStruct;
memcpy(result, tmp, sizeof(MyStruct));
return result;
}
MyStruct* create_struct_b() {
return new (data) MyStruct;
}
当MyStruct :: bytes很小时,gcc 5.3为这两个函数生成相同的asm代码:
create_struct_a():
movl $data, %eax
ret
create_struct_b():
movl $data, %eax
ret
但是当MyStruct :: bytes size大于150 gcc时,5.3产生:
create_struct_a():
subq $168, %rsp
movl $154, %edx
movl $data, %esi
movq %rsp, %rdi
call memcpy
movq %rsp, %rsi
movl $154, %edx
movl $data, %edi
call memcpy
movl $data, %eax
addq $168, %rsp
ret
create_struct_b():
movl $data, %eax
ret
对于较大的结构,我想要没有memcpy的较小的asm代码,但是找不到合法的方法来强制编译器执行此操作。 char data[sizeof(MyStruct)]
也将用于存储size <= sizeof(MyStruct)
的其他打包类型,因此数据类型应为char[sizeof(MyStruct)]
而不是MyStruct
。