2016-09-13 67 views
1

我用memcpy來複制由glm :: vec3對象組成的struct Vertex。它可以在類函數中複製結構。 它在複製構造函數中不起作用,該函數在該函數返回類對象時被調用。等效的memcpy不同的結果?

爲什麼?

類函數返回對象

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

我看到'綠黨[]'是頂點對象的數組,但什麼是'indices'的聲明?例如,如果它是一個指向動態內存的指針,「sizeof(indices)'將是一個指針的大小,而不是指向的數組的大小。你可以嘗試'sizeof(indices [0])* data.numIndices'。 – Davislor

回答

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); 
+0

謝謝!另一個作品是'Vertex []'而不是'Vertex *'。非常感謝! – Chemistpp

+0

@Chemistpp,這是正確的。 –

+1

不管它是否工作 - 你應該總是使用'std :: copy'而不是'memcpy',因爲即使類型不是安全的memcpyable它仍然可以工作 –