[C++] Object Lifetimes reading minute
class Vec {
public:
double* data() { return &x; }
private:
double x,y,z;
};
Eigen::Map<...>(absl::Span<Vec>);
*(Vect::data() + 1) // Does not give us y
Take away:
* Even though x, y, and z are allocated sequentially in memory without padding,
physical layout does not supersede semantic rules.
* The layout guarantees mean you can safely memcpy the data, or cast a Vec* to a double* to access the first element (x). It does not grant permission to use pointer arithmetic on double* to slide across the members.
* The pointer arithmetic is only guaranteed within the type of array.
* Pointer to variable only is considered as pointer to array of size 1.
* Thus any pointer arithmetic on single variable is considered out-of-bound; compiler is free to assume anything.
(reference: https://timsong-cpp.github.io/cppwp/n4140/expr.add#5)
Explain:
Only char*, unsigned char*, and std::byte* are explicitly granted an exception in the standard to
examine the raw object representation. double* enjoys no such privilege.
Fix:
class Vec {
public:
double* data() { return data_; } // Legal: returns pointer to element 0 of a 3-element array
private:
double data_[3]; // x=data_[0], y=data_[1], z=data_[2]
};
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.