【问题标题】:What happens if my Visual C++ custom memory allocator returns a block not properly aligned?如果我的 Visual C++ 自定义内存分配器返回一个未正确对齐的块会怎样?
【发布时间】:2011-05-22 17:50:34
【问题描述】:

在我的 Visual C++ 程序中,我使用了一个自定义的operator new,它使用malloc() 来分配内存。我自定义的operator new将额外的数据存储在内存的前4个字节中,并返回一个偏移指针作为块的开头(程序是32位的):

 void* operator new( size_t size )
 {
     size += sizeof( int );//assume it doesn't overflow
     int* result = static_cast<int*>( malloc( size ) );
     if( result == 0 ) {
         throw std::bad_alloc;
     }
     *result = ... //write extra data
     return result + 1;
 }

现在,如果调用者代码想要存储一个大小为 64 位的变量(__int64double),则该块将无法正确对齐。

这会对 32 位 Windows 程序造成什么问题?

【问题讨论】:

  • AFAIK - 可能会有一些性能下降。 x86 会自动修复错位。
  • 如果使用需要 8 字节或 16 字节对齐的内存地址的 SIMD 指令(大多数都这样做),可能会导致崩溃,否则只会降低性能。
  • 加入俱乐部。我也有自己的内存分配器(主要是为了简化内存相关问题的调试、记录统计信息、泄漏报告……)。我使用一个头,我总是填充到 8 个字节的倍数,并且从来没有遇到过问题。但我不知道 4 个字节。
  • @Patrick:是的,我知道如何修复它,但是这样的修复会增加内存使用量并且需要进行测试,所以我想先评估一下影响。
  • @sharptooth,您可以检查请求的大小是否为 8 的倍数。如果不是,请额外分配 4 个字节并使用它来存储您的额外数据。如果它是 8 的倍数,则额外分配 8 个字节并使用这额外 8 个字节的最后 4 个字节来存储您的额外数据。这可能已经提高了内存使用率。

标签: c++ visual-c++ memory-management alignment


【解决方案1】:

在 32 位窗口上,它可能会更慢,因为硬件可以处理未对齐的数据访问,只是更慢。

在其他操作系统/平台上,它可能会导致崩溃(或者性能非常慢,因为操作系统会捕获未对齐的内存访问并在某些情况下为您模拟它)

【讨论】:

    猜你喜欢
    • 2012-07-08
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 2019-05-13
    • 2015-01-31
    • 1970-01-01
    • 2019-08-11
    • 2021-11-01
    相关资源
    最近更新 更多