Арифметика указателя выполняется по размеру статического типа [*] указателя, поэтому он будет эффективно добавлять sizeof *ptr
. Выравнивание элементов будет учитываться по размеру объекта как выравнивание типа (заполнение в конце объекта).
struct test {
int a;
char b;
};
Размер test
не будет равен 5 (при условии 32-битных значений), если тип выровнен по 4 байта.
[*] Обратите внимание, что в C ++ вы можете назначить адрес производного объекта базовому классу, но арифметика указателей будет работать с типом указателя , а не с реальными объектами:
struct base { int x; };
struct derived : base { int y; };
int main() {
base * p = new derived[10];
base * q = p+1; // this does not point to the second `derived`!!!
}