1
12
根据标准,如果程序员没有为一个类提供复制构造函数,编译器将合成一个显示 缺省的按成员初始化 . (12.8.8)然而,在12.8.1中,标准还规定:
这里的操作词是“概念上的”,根据 Lippman 为编译器设计人员提供了一个“out”来在“divial”(12.8.6)隐式定义的复制构造函数中实际执行成员级初始化。 在实践中,编译器必须为这些类合成复制构造函数,这些类的行为就好像它们在执行成员级初始化一样。但是,如果类显示“位复制语义”(Lippman,第43页),那么编译器不必合成复制构造函数(这将导致函数调用,可能是内联的),而是执行位复制。这一主张显然是在 ARM 但我还没查到这个。
使用编译器验证某个东西是否符合标准始终是一个坏主意,但是编译代码并查看生成的程序集似乎可以验证编译器不是在合成的复制构造函数中执行成员级初始化,而是执行
为生成的程序集
…在哪里
这是在调试模式下在MSVC9下编译的。 编辑:这篇文章的长与短分别是:
1)只要执行逐位复制会显示出与memberwise copy相同的副作用,标准就允许普通的隐式复制构造函数执行
2)有些编译器实际上是这样做的
|
2
11
让我给你一个经验性的答案:在我们的实时应用程序中,我们一直在这样做,而且它工作得很好。对于Wintel和PowerPC的msvc以及Linux和Mac的gcc,甚至对于具有构造函数的类也是如此。 我不能引用C++标准的章节,只是实验证据。 |
3
9
你的类有一个构造函数,所以在C结构的意义上,pod不是。因此,用memcpy()复制它是不安全的。如果需要POD数据,请删除构造函数。如果您想要非POD数据,而控制结构是必需的,那么不要使用memcpy()——这两者都不能。 |
4
9
你 能够 . 但首先问问你自己: 为什么不使用编译器提供的复制构造函数来进行成员级的复制呢? 您是否存在需要优化的特定性能问题? 当前的实现包含所有pod类型:当有人更改它时会发生什么? |
5
8
是:您的代码会做出一些既没有建议也没有文档记录的假设(除非您专门记录了它们)。这是 恶梦 用于维护。 另外,您的实现基本上是黑客攻击(如果有必要的话,这不是一件坏事),它可能取决于(不确定)当前编译器是如何实现的。 这意味着,如果您在一年(或五年)之后升级编译器/工具链(或只更改当前编译器中的优化设置),没有人会记得这一黑客行为(除非您努力保持其可见),您可能会以未定义的行为结束,开发人员会在几年后诅咒“谁做了这件事”的ROA。d. 这并不是说决策不可靠,而是维护人员无法预料到(或将要预料到)。 最小化(未预期?)我将根据类的当前名称将类移动到命名空间中的一个结构中,该结构中根本没有内部函数。然后你要清楚地看到一个内存块,并把它当作一个内存块。 而不是:
你应该有:
这样你:
|
6
5
你可以使用
|
7
3
我会注意到你承认这里有一个问题。你知道潜在的缺点。 我的问题是维修。你有信心这个类中没有人会包含一个会破坏你伟大优化的字段吗?我不是,我是工程师而不是先知。 所以,不要试图改进复制操作…为什么不试着完全避免呢? 是否可以更改用于存储的数据结构以停止移动元素…或者至少没有那么多。
例如,你知道
也许你应该专注于寻找更好的收藏品,而不是快速而肮脏的作品? |
8
1
在非pod类上调用memcpy是未定义的行为。我建议按照基里尔的建议来断言。使用memcpy可以更快,但是如果复制操作在代码中不是性能关键的,那么只需使用按位复制。 |
9
1
当谈到你所指的案件时,我建议你声明 结构 而不是 班 'es。它使读取更容易(并且争议更小):并且默认的访问说明符是公共的。 当然,在这种情况下,您可以使用MeMCPY,但注意不要在结构(如C++类)中添加其他类型的元素(由于明显的原因,您不知道MeMCPY会如何影响它们)。 |
10
0
它会起作用,因为在C++中,(POD)类与结构(不完全,默认访问…)相同。你可以用memcpy复制pod结构。 POD的定义是没有虚拟函数,没有构造函数,解构器,没有虚拟继承…等。 |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |