Nach meinen kleinen Tests funktioniert dieser Code. Aber, hat es undefiniertes Verhalten? Das Ändern des const-Objekts durch Verwendung von const_cast führte zu Laufzeitzugriffsverletzungen in meinen vorherigen Tests, aber ich kann mich nicht erinnern, wie unterschiedlich sie waren. Also, ist hier grundsätzlich etwas falsch oder nicht?Hat diese Const-Initialisierung durch const_cast ein undefiniertes Verhalten?
// test.h
#pragma once
#include <boost/array.hpp>
typedef boost::array<int,100000> bigLut_t;
extern const bigLut_t constBigLut;
// test.cpp
#include "test.h"
bigLut_t& initializeConstBigLut()
{
bigLut_t* pBigLut = const_cast<bigLut_t*>(&constBigLut);
for(int i = 0; i < 100000; ++i) {
pBigLut->at(i) = i;
}
return const_cast<bigLut_t&>(constBigLut);
}
const bigLut_t constBigLut = initializeConstBigLut();
// const_test.cpp
#include <iostream>
#include "test.h"
void main()
{
for(int i = 0; i < 100; ++i) {
std::cout << constBigLut[i] << std::endl;
}
system("pause");
}
(Beachten Sie, dass sizeof (bigLut_t) ist zu viel in den Stapel.)
EDIT: Eigentlich mag ich die Idee in ybungalobill des Kleiner Kommentar am besten für eine Methode zur Initialisierung dieser großen Objekte:
// test.h
#pragma once
#include <boost/array.hpp>
extern const struct BigLut : public boost::array<int,100000> {
BigLut();
} constBigLut;
// test.cpp
#include "test.h"
const BigLut constBigLut;
BigLut::BigLut()
{
for(int i = 0; i < 100000; ++i) {
this->at(i) = i;
}
}
abgesehen von dem Rest, 'Leere main' ist illegal in C++. 'main' muss ** immer ** den Rückgabetyp' int' haben. Sie können die Anweisung 'return' jedoch sicher weglassen. –