我正在使用这个辅助函数将不同的数据类型打包到一个缓冲区中:
template <class T>
static inline void PushBack(T& value, void*& buffer) {
T* typedBuffer = (T*)buffer;
memcpy(buffer, &value, sizeof(value));
typedBuffer++;
buffer = typedBuffer;
}
我正在调用一个带有12B和16B向量(3或4个浮点数)的循环,它工作正常。
但是,我的其他方法不是:
template <class T>
static inline void PushBack(T& value, void*& buffer) {
T* typedBuffer = (T*)buffer;
memcpy((T*)buffer, &value, sizeof(value)); //crash on 16B
typedBuffer++;
buffer = typedBuffer;
}
template <class T>
static inline void PushBack(T& value, void*& buffer) {
T* typedBuffer = (T*)buffer;
memcpy(typedBuffer, &value, sizeof(value)); //crash
typedBuffer++;
buffer = typedBuffer;
}
template <class T>
static inline void PushBack(T& value, void*& buffer) {
T* typedBuffer = (T*)buffer;
*typedBuffer = value; //crash
typedBuffer++;
buffer = typedBuffer;
}
在使用EXC_BAD_ACCESS(EXC_I386_GPFLT)预先复制总量36B之后,这三个示例在复制16B值时总是崩溃。
这是在intel上运行并编译为发布(最快,最小)。我还无法检查装配中发生了什么。
当我只复制16B向量时,问题不会发生,所以我认为这与指针未与16B对齐的事实有关。我可以在最后一种情况下理解它(通过指针复制到指针),但为什么它在memcpy中很重要?
答案 0 :(得分:1)
已解决 - 在一个案例中,来自外部库的结构强制对齐。