Size: a a a

2021 February 11

D

Danya in supapro.cxx
Dmitriy
Разве только для них?
Я не знаю, я спрашиваю)
источник

D

Dmitriy in supapro.cxx
Кажется, пора открывать Стандарт
источник

D

Danya in supapro.cxx
Dmitriy
Кажется, пора открывать Стандарт
Ой ну его нафиг :D
источник

AM

Aleksander Mironov in supapro.cxx
Ilia Zviagin
в С это тоже не гарантируется, в частности, есть дырки.
Вот можно поподробнее про дырки в С для начала.
Структура рода

typedef struct  {
   uint8_t byte;
   uint8_t byte2;
   uint16_t word;
}A

Вот имея указатель на A, я могу его кастануть в указатель на
uint8_t
и получить собственно
byte
.
После этого инкрементировав указатель на
uint8_t
и получить
byte2
.
После этого инкрементировать еще раз и кастануть в указатель на
uint16_t
и получить
word
.
источник

AM

Aleksander Mironov in supapro.cxx
Это гарантируется как либо или внезапно перенеся код куда либо, могу получить хрен?
источник

AM

Aleksander Mironov in supapro.cxx
(не трогая алигменты пока )
источник

ר

רחפ in supapro.cxx
Aleksander Mironov
Вот можно поподробнее про дырки в С для начала.
Структура рода

typedef struct  {
   uint8_t byte;
   uint8_t byte2;
   uint16_t word;
}A

Вот имея указатель на A, я могу его кастануть в указатель на
uint8_t
и получить собственно
byte
.
После этого инкрементировав указатель на
uint8_t
и получить
byte2
.
После этого инкрементировать еще раз и кастануть в указатель на
uint16_t
и получить
word
.
Нет, в Си так не прокатит в структурах. Нужно знать размеры каждого типа в структуре.
источник

IZ

Ilia Zviagin in supapro.cxx
Sergey Sobolev
вроде всегда гарантировалось что в Си, что в Си++
Никогда не гарантировалось. Было понятие POD - структура без мемберов и без ограничения доступа, и кажется без наследования.

Для неё гарантировалось "как в С", то есть порядок такой же и гарантированный.

Теперь -- описано тут

https://en.cppreference.com/w/cpp/language/data_members

Layout, Standard layout
источник

AM

Aleksander Mironov in supapro.cxx
רחפ
Нет, в Си так не прокатит в структурах. Нужно знать размеры каждого типа в структуре.
Т.е. знать не размер типа, а размер именно поля структуры?
источник

AM

Aleksander Mironov in supapro.cxx
Ну потому, что в примере - размер типов я знаю.
источник

IZ

Ilia Zviagin in supapro.cxx
Aleksander Mironov
Вот можно поподробнее про дырки в С для начала.
Структура рода

typedef struct  {
   uint8_t byte;
   uint8_t byte2;
   uint16_t word;
}A

Вот имея указатель на A, я могу его кастануть в указатель на
uint8_t
и получить собственно
byte
.
После этого инкрементировав указатель на
uint8_t
и получить
byte2
.
После этого инкрементировать еще раз и кастануть в указатель на
uint16_t
и получить
word
.
Вот имея указатель на A, я могу его кастануть в указатель на
uint8_t
и получить собственно
byte


Имеешь
.

После этого инкрементировав указатель на
uint8_t
и получить
byte2

Не имеешь.

После этого инкрементировать еще раз и кастануть в указатель на
uint16_t
и получить
word

Не
имеешь
источник

D

Dmitriy in supapro.cxx
רחפ
Нет, в Си так не прокатит в структурах. Нужно знать размеры каждого типа в структуре.
Сказано же было - выравнивание в счёт не берем
источник

ר

רחפ in supapro.cxx
Aleksander Mironov
Т.е. знать не размер типа, а размер именно поля структуры?
Ой), неправильно прочитал), если добавлять по размеру или sizeof(тип), то все будет норм.
источник

SS

Sergey Sobolev in supapro.cxx
Aleksander Mironov
Вот можно поподробнее про дырки в С для начала.
Структура рода

typedef struct  {
   uint8_t byte;
   uint8_t byte2;
   uint16_t word;
}A

Вот имея указатель на A, я могу его кастануть в указатель на
uint8_t
и получить собственно
byte
.
После этого инкрементировав указатель на
uint8_t
и получить
byte2
.
После этого инкрементировать еще раз и кастануть в указатель на
uint16_t
и получить
word
.
так чтоно делать нельзя, можно в паддинг попасть, если упакованы, то можно, но там теперь выравнивание играет роль
источник

AM

Aleksander Mironov in supapro.cxx
Ilia Zviagin
Вот имея указатель на A, я могу его кастануть в указатель на
uint8_t
и получить собственно
byte


Имеешь
.

После этого инкрементировав указатель на
uint8_t
и получить
byte2

Не имеешь.

После этого инкрементировать еще раз и кастануть в указатель на
uint16_t
и получить
word

Не
имеешь
А вот чуточку поподробнее?
источник

AM

Aleksander Mironov in supapro.cxx
Наверно я дурак и не правильно вопрос поставил изначально.
Имеет ли право компилятор напихать че своего в начало памяти занимаемой экземпляром класса, в его середину.
Перемешать поля местами и тп?
источник

AM

Aleksander Mironov in supapro.cxx
Вот это наверное более верно будет.
источник

ר

רחפ in supapro.cxx
Ilia Zviagin
Вот имея указатель на A, я могу его кастануть в указатель на
uint8_t
и получить собственно
byte


Имеешь
.

После этого инкрементировав указатель на
uint8_t
и получить
byte2

Не имеешь.

После этого инкрементировать еще раз и кастануть в указатель на
uint16_t
и получить
word

Не
имеешь
Почему нет, ведь такой способ применятся в linux коде и coreboot. Или я неверно понял?
источник

AM

Aleksander Mironov in supapro.cxx
Или я могу все-таки рассчитывать на то, что указатель на экземпляр это грубо - теже поля в том же порядке.
источник

IZ

Ilia Zviagin in supapro.cxx
Aleksander Mironov
Наверно я дурак и не правильно вопрос поставил изначально.
Имеет ли право компилятор напихать че своего в начало памяти занимаемой экземпляром класса, в его середину.
Перемешать поля местами и тп?
Имеет. Паддинг, выравнивание
источник