2016-09-13 4 views
1

Я использовал memcpy для копирования структуры Vertex, состоящей из объектов glm :: vec3. Он работал, чтобы скопировать структуру в функцию класса. Он не работал в конструкторе копирования, который вызывался, когда эта функция возвращала объект класса.Эквивалентные 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; 

} 

Vertex:

#ifndef VERTEX_H 
#define VERTEX_H 

#include <glm/glm.hpp> 

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

#endif 
+1

Я вижу, что 'Verts []' представляет собой массив объектов Vertex, но то, что это заявление о 'indices'? Если, например, это указатель на динамическую память, 'sizeof (индексы)' будет размером указателя, а не указанного массива. Вы можете попробовать 'sizeof (индексы [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 –