Стандарты программирования на С++




Обсуждение


Стандарт C++ дает очень мало гарантий по поводу представления типов в памяти.

Целые числа используют двоичное представление.

Для отрицательных чисел используется дополнительный код числа в двоичной системе.

Обычные старые типы (Plain Old Data, POD5) имеют совместимое с С размещение в памяти: переменные-члены хранятся в порядке их объявления.

Тип int занимает как минимум 16 битов.

В частности, достаточно распространенные соглашения не гарантированы ни для всех имеющихся архитектур, ни тем более для архитектур, которые могут появиться в будущем. Так что не забывайте о следующем.

Размер int не равен ни 32 битам, ни какому-либо иному фиксированному размеру.

Указатели и целые числа не всегда имеют один и тот же размер и не могут свободно преобразовываться друг в друга.

Размещение класса в памяти не всегда приводит к размещению базового класса и членов в указанном порядке.

Между членами класса (даже если они являются POD) могут быть промежутки в целях выравнивания.

offsetof работает только для POD, но не для всех классов (хотя компилятор может и не сообщать об ошибках).

Класс может иметь скрытые поля.

Указатели могут быть совсем не похожи на целые числа. Если два указателя упорядочены и вы можете преобразовать их в целые числа, то получающиеся значения могут быть упорядочены иначе.

Нельзя переносимо полагаться на конкретное размещение автоматических переменных в памяти или на направление роста стека.

5Неформально POD означает любой тип, представляющий собой набор простых данных, возможно, с пользовательскими функциями-членами для удобства. Говоря более строго, POD представляет собой класс или объединение, у которого нет пользовательского конструктора, копирующего присваивания, и деструктора, а также нет (нестатических) членов-данных, являющихся ссылками, указателями на члены или не являющихся POD. — Прим. ред.

Стр.191

Указатели на функции могут иметь размер, отличный от размера указателя void*, несмотря на то, что некоторые API заставляют вас предположить, что их размеры одинаковы.

Из-за вопросов выравнивания вы не можете записывать ни один объект по произвольному адресу в памяти.

Просто корректно определите типы, а затем читайте и записывайте данные с использованием указанных типов вместо работы с отдельными битами, словами и адресами. Модель памяти C++ гарантирует эффективную работу, не заставляя вас при этом работать с представлениями данных в памяти. Так и не делайте этого.




Содержание  Назад  Вперед