首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何memcpy()常量

如何memcpy()常量
EN

Stack Overflow用户
提问于 2013-02-16 21:06:06
回答 3查看 9.2K关注 0票数 1

如何在c++中使用memcpy()常量例如,我使用

代码语言:javascript
复制
#define constant1 0x0080

当我想的时候

代码语言:javascript
复制
memcpy(&some_memory_block, constatnt1, 2 );

上面写着

代码语言:javascript
复制
error C2664: 'memcpy' : cannot convert parameter 2 from 'int' to 'const void *'
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-16 21:09:48

您可以尝试使用常量,而不是预编译器定义。

代码语言:javascript
复制
const unsigned short int constant1 = 0x0080;
memcpy(&some_memory_block, &constant1, 2 );
票数 4
EN

Stack Overflow用户

发布于 2013-02-16 21:26:39

你的常量(宏)实际上只是一个文字。因此,它没有可以作为参数提供给memcpy或另一个需要内存位置的函数的地址。如果你想这样做,你需要有一个真正的常量(比如const int),就像其他答案中建议的那样。

与宏相反的实常量(这只是一个文本替换,在本例中是一个文字)通常在功能上与文字相同,只要您不接受它的地址。但是,可以接受它的地址,在这一点上,它的行为就像一个“普通”变量。这意味着您可以在其地址上使用memcpy

然而,通常“更正确”的答案是:根本不要做这种事情。如果某件事是一个常量,你不应该复制它(当然有例外,但通常你不应该这样做)。唯一有效的原因是,您需要一个常量值来初始化非常量变量,但是将其赋值比将其赋值给memcpy要容易得多。

否则,复制常量只会增加冗余,毫无益处地消耗额外的内存,增加缓存压力,并破坏许多编译器优化。例如,如果编译器知道像a = b + c - c + b这样的表达式是常量(当然,也会计算复杂得多、不太明显的表达式),它就可以将这些表达式简单地优化为a = computed_value_of_2b。但是,当给定一些内存位置时,编译器必须发出在运行时计算的代码,它没有其他选择。

票数 3
EN

Stack Overflow用户

发布于 2013-02-16 21:11:15

在您的例子中,当您编译代码时,constant1被替换为0x0080。这一行

代码语言:javascript
复制
memcpy(&some_memory_block, constatnt1, 2 );

变成了

代码语言:javascript
复制
memcpy(&some_memory_block, 0x0080, 2 );

如果您查看memcpy,您将看到memcpy为第二个参数请求了一个指针。

你必须创建一个指向memcpy的指针

代码语言:javascript
复制
const int constant1 = 0x0000;
memcpy(&some_memory_block, &constant1 , 2 );
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14910615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档