Memcpy崩溃,具体取决于指针类型



我正在使用此辅助功能将不同的数据类型打包到单个缓冲区中:

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;
}

这三个示例在复制16B值时总是崩溃,此后以前复制了36B的总量(exc_i386_gpflt)。

这是在英特尔上运行的,并作为释放(最快,最小)编译。我无法检查大会中发生的事情。

当我仅复制16B向量时,问题不会发生,因此我认为这与指针不符与16B的事实有关。我可以在最后一个情况下理解(通过指针指针复制),但是为什么在memcpy中很重要?

已解决 - 在一个情况下,在一个情况下,来自外部库的结构正在强制对齐。

最新更新