等效memcpy不同的结果?

时间:2016-09-13 19:45:54

标签: c++ copy-constructor memcpy

我使用memcpy复制由glm :: vec3对象组成的结构Vertex。 它可以在类函数中复制结构。 它在该函数返回类对象时调用的复制构造函数中不起作用。

为什么?

类函数返回对象

ShapeData ShapeGenerator::drawTriangle() {
    ShapeData ret;

    Vertex verts[] = {
        glm::vec3(0.0f, 1.0f, 0.0f),
        glm::vec3(1.0f, 0.0f, 0.0f),

        glm::vec3(-1.0f, -1.0f, 0.0f),
        glm::vec3(0.0f, 1.0f, 0.0f),

        glm::vec3(1.0f, -1.0f, 0.0f),
        glm::vec3(0.0f, 0.0f, 1.0f),
    };

    ret.numVerts = NUM_ARRAY_ELEMENTS(verts);
    ret.verts = new Vertex[ret.numVerts];
    memcpy(ret.verts, verts, sizeof(verts)); //WORKS

    GLushort indicies[] = {0,1,2};
    ret.numIndicies = NUM_ARRAY_ELEMENTS(indicies);

    ret.indicies = new GLushort[ret.numIndicies];
    memcpy(ret.indicies, indicies, sizeof(indicies));

    return ret;
}

复制构造函数

ShapeData(const ShapeData& data) {

    verts = new Vertex[data.numVerts];
    //memcpy(verts, data.verts, sizeof(data.verts)); //DOES NOT WORK
    std::copy( data.verts, data.verts + data.numVerts, verts);


    indicies = new GLushort[data.numIndicies];
    memcpy(indicies, data.indicies, sizeof(data.indicies));

    numVerts = data.numVerts;
    numIndicies = data.numIndicies;

    std::cout << numVerts << std::endl;

}

顶点:

#ifndef VERTEX_H
#define VERTEX_H

#include <glm/glm.hpp>

struct Vertex {
    glm::vec3 position;
    glm::vec3 color;
};

#endif

1 个答案:

答案 0 :(得分:8)

memcpy(verts, data.verts, sizeof(data.verts)); //DOES NOT WORK

不起作用,因为verts是指针,而不是数组。 sizeof(data.verts)不计算指针指向的数组大小。它只是评估平台上指针的大小。

你应该可以使用:

size_t n = sizeof(*data.verts)*data.numVerts;
memcpy(verts, data.verts, n);
相关问题