2017-07-26 48 views
-2

我想将一个结构对象复制到一个指针变量,其中我已经使用_aligned_malloc分配了内存,我想要的是将结构复制超过1次。如果我复制它1次,否则它不会。这是代码片段:使用aligned_malloc和memcpy将结构复制到指针多次

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字节。 谢谢。

+3

C和C++是不同的语言,代码应该写在每个不同的语言。请删除无关标签。还有什么是'_aligned_malloc'?它不是一个标准功能。它可能是您不允许在应用程序代码中使用的内部符号。提供[mcve]。 “我的代码不起作用”不是有效的问题描述。阅读[问]。 – Olaf

+0

我鼓励你把它写成'memcpy(&dev_probConfig [i],h_probConfig,sizeof(ProbConfig));'。这更清楚并保证正确处理指针运算。我假设你已经将'h_probConfig'声明为一个指针。 –

回答

2

这是指针运算的下一个棘手的方面通过sizeof(T)添加1的指针,TO-牛逼增量,而不是按照1所以,你应该删除* sizeof(ProbConfig)让这个做你想做的。

假设这实际上是C,这将是更好的风格来写这个是可以:

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]相同dev_probConfig + i ,但它更清晰,正是因为指针算术的这种技巧。

此外,蒙上了malloc样功能C.这是没有必要的结果,并且它可以隐藏的错误:例如,如果你忘了,包括在使用malloc程序stdlib.h中,传统的“隐式声明”规则踢入并且malloc被视为返回int而不是void *。如果intvoid *的大小不相同(例如,因为int的宽度是32位,但指针的宽度是64位),这会以一种可能在您的程序不得不比平常更紧密地关闭数据之前才会注意到的方式破坏指针。你会从编译器得到一个警告 - 但是只有当你没有强制返回值。

(在C++中,你要投的malloc样函数的结果,但在C++中,你应该使用std::vector反正你可以使用一个custom allocator得到std::vector与数组备用定位;这看起来可怕复杂但实际上只是很多样板)。

+0

对于(i = 0; i mfro

+0

不,我的意思是直接分配结构而不是编译器的工作,试图用'memcpy()' – mfro

+0

@mfro优化结构赋值有什么问题我只想改变真正需要改变的东西。确实,你的版本比较简单,但是OP有'memcpy',并且没有什么可以这样做。 – zwol