English 中文(简体)
在C++中,我可以使用薄膜复制没有点人或虚拟功能的班级
原标题:Can I use memcpy in C++ to copy classes that have no pointers or virtual functions

我有一等同;

class MyClass
{
public:
  MyClass();
  int a,b,c;
  double x,y,z;
};

#define  PageSize 1000000

MyClass Array1[PageSize],Array2[PageSize];

如果我的班子没有点子或虚拟方法,使用以下方法是否安全?

memcpy(Array1,Array2,PageSize*sizeof(MyClass));

我请求的理由是,Im处理大量页数数据集,如记录here,业绩至关重要,而mcpy为重复性转让提供了重大的业绩优势。 我怀疑这应该是ok的,因为这个点子是暗的参数,而不是储存的任何东西,但我是否知道任何其他隐蔽的新东西?

<><>Edit>:

根据对流体的评论,数据不包括任何处理材料或类似参考资料。

附录 R s comment, I ve Profiled the Code, and prevention the pornographyor is about 4.5倍于此。 这里的部分原因,是我的模版阵列类别比所举的简单化例子更加复杂,在为无法复制的类型分配记忆时,需要重新定位。 这实际上意味着把违约建筑商和复印件建筑商叫来。

Second edit

也许值得指出的是,我完全同意,以这种方式使用肉类是不良的做法,一般情况下应避免。 正在使用该模型的具体案例是高性能模版阵列类别的一部分,其中包括一个参数,允许使用微粒而不是复印件。 这对业务具有重大的影响,例如拆除一个阵列开始附近的一个部件,以及将数据输入二级储存和从中提取。 更好的理论解决办法是将这一类别转换成一个简单的结构,但鉴于这涉及对大型法典基础的重心,避免它不是我热衷的事情。

最佳回答

根据该标准,如果一个班级的施工人员不提供复印件,汇编者将合成一个展示default memberwise initialization的建筑商。 (12.8.8) 但是,在12.8.1中,《标准》也指出:

A class object can be copied in two ways, by initialization (12.1, 8.5), including for function argument passing (5.2.2) and for function value return (6.6.3), and by assignment (5.17). Conceptually, these two operations are implemented by a copy constructor (12.1) and copy assignment operator (13.5.3).

此处的操作词是“怀疑”,根据Lippman,编辑设计师可实际在“trivial”(12.8.6)中进行成员选择。

在实践中,汇编者必须综合这些类别中的影印机,显示他们的行为,如他们正在做成员选择。 但是,如果“Bitwise Semantics”(Lippman,第43页)的班级展览会,则编集者不必合成影印件(这将导致功能电话,可能上网),而是做双向复印件。 这项索赔显然在ARM上得到了支持,但我尚未对此进行调查。

利用汇编者证实某些符合标准的情况总是不好,但编纂你的守则和观察所形成的大会似乎可以核实,汇编者并没有在综合影像构造中做成员选择,而是做一个memcpy。 相反:

#include <cstdlib>

class MyClass
{
public:
    MyClass(){};
  int a,b,c;
  double x,y,z;
};

int main()
{
    MyClass c;
    MyClass d = c;

    return 0;
}

为<代码>MyClass d = c;生成的组件是:

000000013F441048  lea         rdi,[d] 
000000013F44104D  lea         rsi,[c] 
000000013F441052  mov         ecx,28h 
000000013F441057  rep movs    byte ptr [rdi],byte ptr [rsi] 

www.un.org/Depts/DGACM/index_french.htm

它是在Dobug模式下汇编的。

EDIT:

该员额很长,时间很短:

(1) 只要做双向拷贝就会显示与成员复印件相同的副作用,《标准》便允许三维隐含影印件制作人做memcpy<<>>>>而不是成员复印件。

(2) 一些编篡人实际上确实做的是memcpy,而不是合成一只三维制影印件,该复印件是成员复印件。

问题回答

让我给你一个经验性答案:在我们的实时评估中,我们全时都这样做,而且我们的工作是公正的。 MSVC公司(Wintel and PowerPC)和海湾合作委员会(海合会)公司(CFC)和Mac公司(即使有建筑商的班级也是如此。

我可以引用C++标准中的一章和文字,而只是试验证据。

你的班子有一位建筑师,从建筑的意义上来说,这不是一个建筑工程。 因此,用肉类复制它是不安全的。 如果你想要POD数据,就去除建筑商。 如果你想要非POD数据,如果控制性建筑是必要的,则不使用肉类——你可以有两种数据。

页: 1 但首先要求:

为什么不只使用您的汇编者提供的复印件――施工商做成员的复印件?

你们是否有具体的业绩问题需要加以选择?

目前的执行包含所有裁军厅类:当有人改变它时会发生什么情况?

[...] but are there any other hidden nasties I should be aware of?

是:你的法典提出了一些既不建议也不记录(除非你具体记载这些假设)。 页: 1

此外,你的执行工作基本上是 ha忙的(如果有必要的话,这并非坏事),而且可能取决于(而不是取决于这一点)您目前的汇编者如何执行事情。

这意味着,如果你从现在起将编辑/工具链提升一年(或5年)(或仅仅在你目前的汇编者中改变优化环境),那么没有人会记得这个黑板(除非你为保持其可见度作出很大努力),而且你最终可能掌握在你手中的不明确行为,而开发商则在几年的路上将“谁” cur倒。

这项决定不是不错的,而是认为(或将)维持者意外。

尽量减少这种情况(不投机?) 我将把这一类别移至一个以目前类别名称为基础的名称空间内的结构,而结构中没有任何内部职能。 接着,你正在表明,你重新审视了记忆圈,把它当作记忆圈。

而不是:

class MyClass
{
public:
    MyClass();
    int a,b,c;
    double x,y,z;
};

#define  PageSize 1000000

MyClass Array1[PageSize],Array2[PageSize];

memcpy(Array1,Array2,PageSize*sizeof(MyClass));

应:

namespace MyClass // obviously not a class, 
                  // name should be changed to something meaningfull
{
    struct Data
    {
        int a,b,c;
        double x,y,z;
    };

    static const size_t PageSize = 1000000; // use static const instead of #define


    void Copy(Data* a1, Data* a2, const size_t count)
    {
        memcpy( a1, a2, count * sizeof(Data) );
    }

    // any other operations that you d have declared within 
    // MyClass should be put here
}

MyClass::Data Array1[MyClass::PageSize],Array2[MyClass::PageSize];
MyClass::Copy( Array1, Array2, MyClass::PageSize );

您:

  • 明确无误的是,我的地图册:数据是个POD结构,而不是一个类别(如果我记得正确的话,这些结构将相同或非常接近),但阅读该代码的节目者也可以看到这一点。

  • 在两年内,将肉类(如果你必须改变为 st子:范围或其他东西)的使用集中起来,你就这样做了。

  • 使得肉类的使用接近于POD结构的实施。

您可使用<代码>memcpy复制各类多氯二苯并呋喃。 添加关于<代码>boost:is_pod的静态主张将是一个好的想法。 你的班子现在不是POD型。

物理类型、列举类型、点类型和成员类型点为OD。

聚苯胺类的精华版本本身就是一种多氯二苯并呋喃类型。

An array of POD is itself POD. A struct or union, all of whose non-static data members are POD, is itself POD if it has:

  • No user-declared constructors.
  • No private or protected non-static data members.
  • No base classes.
  • No virtual functions.
  • No non-static data members of reference type.
  • No user-defined copy assignment operator.
  • No user-defined destructor.

我将注意到,你在此承认存在一个问题。 你们知道潜在的缺点。

我的问题是维护。 你们是否相信,没有人会把一个领域列入这一类别,这将给你带来最佳的印象? 我不说,我是一名工程师,不是先知。

因此,不是试图改进复制作业......为什么不试图完全避免。

有可能改变用于储存的数据结构,以停止将部分移至......或至少不会如此之多。

例如,你知道<代码>blist(<>>>>)。 例如,B+Tree可允许使用与病媒相当相似的性能指数(比较少,被承认为较慢),同时尽可能减少在插入/删除时将一些要素 around起来的数量。

也许你应重点寻找更好的收集方法,而不是 quick忙地进行收集?

给非残疾人组织课堂打上餐牌的做法不明确。 我建议追捕Kirill的拖车。 使用薄膜可以更快,但如果复印操作在你的法典中并不重要,那么只使用双向拷贝。

在谈到该案件时,你再次提到我,建议你宣布struct<>/strong>s 而不是}/strong>。 这使阅读(而且较少争议)变得容易得多,缺省入计者是公开的。

当然,你可以在此案中使用高分法,但认识到在结构中添加其他种类的内容(如C++级)并不建议(由于明显的原因,你不知道高分法会如何影响他们)。

正如John Dibling所指出的,你不应人工使用memcpy。 相反,使用<代码>std:copy。 如果您的级别是可观的,std:copy将自动填写memcpy。 这甚至可能比人工薄膜更快。

如果你使用<代码>std:copy,则你的代码是可以读取的,它总是使用最快的拷贝方式。 如果你在以后某个时候改变你的班子的布局,使其无法再读,则使用<代码>的代码:范围不会中断,而你的人工呼唤是希望的。

现在,你如何知道你的班子是无用的? 以同样方式,<代码>std:copy探测到: 它使用:std:is_trivially_copyable 。 您可使用<代码>static_assert,以确保这一财产得到维护。

注:std:is_trivially_copyable 只能检查信息的类型。 它不理解语义。 下面的类别是三倍可复制的 类型,但双向拷贝是个缩影:

#include <type_traits>

struct A {
  int* p = new int[32];
};

static_assert(std::is_trivially_copyable<A>::value, "");

在双向拷贝之后,复印件的<代码>ptr仍将注明原始记忆。 另见 Rules of three

它将工作,因为C++的“(POD-)”类同“结构”(并非完全的,缺省准入......)。 并且,你可以复制一枚带有微粒的POD。

住房分配的定义没有虚拟功能,没有建筑,没有虚拟遗产......等。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?