【发布时间】: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 位的变量(__int64 或 double),则该块将无法正确对齐。
这会对 32 位 Windows 程序造成什么问题?
【问题讨论】:
-
AFAIK - 可能会有一些性能下降。 x86 会自动修复错位。
-
如果使用需要 8 字节或 16 字节对齐的内存地址的 SIMD 指令(大多数都这样做),可能会导致崩溃,否则只会降低性能。
-
加入俱乐部。我也有自己的内存分配器(主要是为了简化内存相关问题的调试、记录统计信息、泄漏报告……)。我使用一个头,我总是填充到 8 个字节的倍数,并且从来没有遇到过问题。但我不知道 4 个字节。
-
@Patrick:是的,我知道如何修复它,但是这样的修复会增加内存使用量并且需要进行测试,所以我想先评估一下影响。
-
@sharptooth,您可以检查请求的大小是否为 8 的倍数。如果不是,请额外分配 4 个字节并使用它来存储您的额外数据。如果它是 8 的倍数,则额外分配 8 个字节并使用这额外 8 个字节的最后 4 个字节来存储您的额外数据。这可能已经提高了内存使用率。
标签: c++ visual-c++ memory-management alignment