Comment utiliser un fichier pour initialiser un objet const global trop grand pour être créé dans la pile? Ceci est ma tentative à ce jour:Initialisation d'un objet constant global de grande taille
// test.h
#pragma once
#include <boost/array.hpp>
typedef boost::array<int,100000> bigLut_t;
extern const bigLut_t constLut;
// test.cpp
#include <fstream>
#include <boost/filesystem.hpp>
#include "test.h"
bigLut_t& initializeConstLut()
{
if(boost::filesystem::exists("my_binary_file") == false) {
std::ofstream outStream("my_binary_file", ios::out | ios::binary);
bigLut_t* tempLut = new bigLut_t;
for(int i = 0; i < 100000; ++i) {
// Imagine this taking a long time,
// which is why we're using a file in the first place
tempLut->at(i) = i;
}
outStream.write(reinterpret_cast<char*>(tempLut), sizeof(bigLut_t));
outStream.close();
delete tempLut;
}
// We can't write "bigLut_t lut;" because that would cause a stack overflow
bigLut_t* lut = new bigLut_t; // lut gets never deallocated
std::ifstream inStream("my_binary_file", ios::in | ios::binary);
inStream.read(reinterpret_cast<char*>(lut), sizeof(bigLut_t));
inStream.close();
return *lut;
}
const bigLut_t constLut = initializeConstLut();
cela fonctionne dans AFAIK un sens qui se constLut corretly initialisé, mais il y a une fuite de mémoire depuis bigLut_t * LUT ne fait jamais désallouée. J'ai essayé d'utiliser un pointeur intelligent pour cela, mais cela a abouti à des valeurs dans constLut étant tout à fait aléatoire. Je suis déconcerté par le manque d'information que j'ai trouvé en essayant de google la solution.
Je suis sûr que j'ai essayé à la fois auto_ptr et shared_ptr, mais je suppose que cela n'a pas fonctionné parce que j'ai dé-référencé le pointeur intelligent dans la fonction initializeConstLut. Mais cela semble fonctionner parfaitement, merci. Vous avez manqué .get() à droite de lut dans la fonction de lecture. – zeroes00
Je ne voudrais pas offenser un camarade parisien, mais je trouve dommage que votre solution nécessite la construction d'un objet énorme temporaire suivi d'une construction de copie (ce qui je présume est coûteux) et d'une destruction de l'objet temporaire – icecrime
@icecrime : Je suis complètement d'accord, mais j'ai suivi l'exemple de zeroes00 sur celui-ci.Je n'avais aucun moyen de savoir si les choses pouvaient être faites d'une autre manière, alors j'ai répondu à la question, pas plus. –