等效memcpy不同的结果?

Che*_*tpp 1 c++ copy-constructor memcpy

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

为什么?

类函数返回对象

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;
}
Run Code Online (Sandbox Code Playgroud)

复制构造函数

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;

}
Run Code Online (Sandbox Code Playgroud)

顶点:

#ifndef VERTEX_H
#define VERTEX_H

#include <glm/glm.hpp>

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

#endif
Run Code Online (Sandbox Code Playgroud)

R S*_*ahu 8

memcpy(verts, data.verts, sizeof(data.verts)); //DOES NOT WORK
Run Code Online (Sandbox Code Playgroud)

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

你应该可以使用:

size_t n = sizeof(*data.verts)*data.numVerts;
memcpy(verts, data.verts, n);
Run Code Online (Sandbox Code Playgroud)