In the stxxl
FAQ, I found this:
Parameterizing STXXL Containers
STXXL container types like stxxl::vector can be parameterized only with a value type that is a POD (i.e. no virtual functions, no user-defined copy assignment/destructor, etc.) and does not contain references (including pointers) to internal memory. Usually, "complex" data types do not satisfy this requirements.
This is why
stxxl::vector<std::vector<T> >
andstxxl::vector<stxxl::vector<T> >
are invalid. If appropriate, usestd::vector<stxxl::vector<T> >
, or emulate a two-dimensional array by doing index calculation.
The inability to use stxxl::vector<std::vector<T> >
makes perfects sense, as stxxl
containers do not call constructors or destructors of the contained elements upon container resize. But what about storing a struct like this:
struct S {
int* a;
}
If I do guarantee that the object pointed by a
is valid as long as the stxxl::vector<S>
instance exists, what's a problem in storing this struct
into a stxxl::vector<S>
? If a particular instance of S
has to be moved to disk, then the value of the a
pointer is written on disk. Later on, the pointer value is restored and I can use it. Obviously the pointer value is machine-dependent and instance-dependent too, but is this a matter even if I take care of the lifetime of the pointed object? I am not sending a serialized object via a socket, and I am not storing a serialized object in a database for later use.
Am I missing something?
EDIT: someone reminded me that stxxl
does not copy the pointee, and therefore I may get a pointer-to-garbage when I retrieve an instance of struct S
later on. I know that. I'll guarantee that the pointee is valid throughout the full lifetime of the program.