使用aligned_malloc和memcpy将struct复制到指针多次

时间:2017-07-26 18:44:25

标签: c++ pointers struct

我正在尝试将struct对象复制到指针变量,其中我使用_aligned_malloc分配了内存,我想要的是复制struct超过1次。如果我复制它1次,否则它不会。这是代码的片段:

dev_probConfig = (ProbConfig*)_aligned_malloc(N* sizeof(ProbConfig),64);
for (int i = 0; i < N; ++i) 
{
    memcpy(dev_probConfig + i * sizeof(ProbConfig), h_probConfig, sizeof(ProbConfig));
}

我做错了什么?! 我的结构不包含填充,其大小为512字节。 感谢。

1 个答案:

答案 0 :(得分:2)

这是C中指针算法的一个棘手的方面。将指针添加到指针 T 将其递增sizeof(T),而不是1.所以你应该删除{{ 1}}让你做你想做的事。

假设这实际上是C,那么将它写为:

会更好
* sizeof(ProbConfig)

或使用结构分配而不是dev_probConfig = _aligned_malloc(N * sizeof(ProbConfig), 64); for (size_t i = 0; i < N; i++) memcpy(&dev_probConfig[i], h_probConfig, sizeof(ProbConfig));

memcpy

dev_probConfig = _aligned_malloc(N * sizeof(ProbConfig), 64); for (size_t i = 0; i < N; i++) dev_probConfig[i] = h_probConfig; &dev_probConfig[i]相同,但它更清晰,正是因为指针算法的这种棘手。

此外,在C中强制转换类似dev_probConfig + i的函数的结果。它没有必要,它可以隐藏错误:例如,如果您忘记包含{ {1}}在使用malloc的程序中,旧的“隐式声明”规则开始执行,stdlib.h被视为返回malloc而不是malloc。如果intvoid *的大小不同(例如,因为int是32位宽但指针是64位宽),这将以一种可能不会被注意到的方式破坏指针你的程序必须处理比平时更多的数据。您将收到编译器的警告 - 但前提是您没有强制转换返回值。

(在C ++中你必须转换void *的结果 - 就像函数一样,但是在C ++中你应该使用int。你可以使用custom allocator来获得{{} 1}}与阵列的额外对齐;这个看起来非常复杂但它实际上只是很多样板。)