0

Suppose I have a class with two fields of the same access level and type; if I have a pointer p to the first one, will p + 1 invariably be a pointer to the second? e.g. for a class

class A {

public:
  B first;
  B second;

};

If I then have A a; and B *p = &(a.first);, are there any situations in which (p + 1) == &(a.second) could be false? Does the same apply to member pointers (e.g. B A::*p = &A::first and (p + 1) == &A::second)?

As a larger case, suppose I'm trying to recreate std::array without using builtin arrays. I might try something like this:

template<class T, size_t N>
class array {

  T head;
  array<T, N - 1> rest;

public:

  // ... and all the constructors and methods and whatnot

};

template<class T>
class array<T, 1> {

  T head;

public:

  // ...

};

template<class T>
class array<T, 0> {

public:

  // ...

};

(the special case for 1 is because sizeof(array<T, 0>) is 1 just like any other empty class, meaning that if it is included in the recursion then sizeof(array<T, N>) is sizeof(T) * N + 1 instead of the expected sizeof(T) * N)

Given the above class definition, can I safely define the class's T& operator [](size_t index) simply to return *(&head + index)?

(I realize I could define it to return index ? rest[index - 1] : head, but the recursion would incur some significant overhead, and even if it's tail-call optimized or inlined, it still effectively becomes index ? (index - 1 ? (index - 2 ? ... : rest.rest.head) : rest.head) : head which still involves a lot more jumps than the pointer arithmetic version)

Note: I am not asking if this should be done, but if it can; I am not planning on applying this, I'm just curious. Also, my question is just about the pointer arithmetic stuff, not anything else in my examples.

Anonymous
  • 491
  • 2
  • 12
  • Nope. Padding can be introduced by the compiler for alignment. – BiagioF Dec 10 '19 at 16:47
  • 3
    Even if the members are contiguous, you cannot use the pointer that results from `p+1`. While it may have the same address as the second member, dereferencing is still undefined behavior. *How* you get the pointer matters, it's not enough to just have the address. – François Andrieux Dec 10 '19 at 16:48

0 Answers0