简体   繁体   中英

Memory layout of vector of POD objects

Suppose I have a simple C++ class,

class Data {

    public: 
         float data[3];         

         void clear() { data[0] = 0.0f; data[1] = 0.0f; data[2] = 0.0f }

}

And a vector of Data's,

std::vector<Data> v(10);

Is it safe to assume that &v[0].data[0] points to an array of 30 floats?

From standard

23.3.6.1 Class template vector overview

The elements of a vector are stored contiguously, meaning that if v is a vector where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size()

so &v[0] indeed points to the beginning of 10 continuous Data objects.

but for the layout of Data we have

9.2.13 Class members

Nonstatic data members of a (non-union) class with the same access control (Clause 11) are allocated so that later members have higher addresses within a class object. The order of allocation of non-static data members with different access control is unspecified (11). Implementation alignment requirements might cause two adjacent members not to be allocated immediately after each other; so might requirements for space for managing virtual functions (10.3) and virtual base classes (10.1).

so we cannot be sure that sizeof(Data) == 3*sizeof(float) , therefore general answer should be: it's not save to assume 30 continuous floats.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM