placement new - 缓冲区的值保留

时间:2016-07-03 19:36:50

标签: c++ gcc placement-new

有没有办法保留传递给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

0 个答案:

没有答案