Александреску Андрей
Шрифт:
• Тип
В частности, достаточно распространенные соглашения не гарантированы ни для всех имеющихся архитектур, ни тем более для архитектур, которые могут появиться в будущем. Так что не забывайте о следующем.
• Размер
• Указатели и целые числа не всегда имеют один и тот же размер и не могут свободно преобразовываться друг в друга.
• Размещение класса в памяти не всегда приводит к размещению базового класса и членов в указанном порядке.
• Между членами класса (даже если они являются POD) могут быть промежутки в целях выравнивания.
•
• Класс может иметь скрытые поля.
• Указатели могут быть совсем не похожи на целые числа. Если два указателя упорядочены и вы можете преобразовать их в целые числа, то получающиеся значения могут быть упорядочены иначе.
• Нельзя переносимо полагаться на конкретное размещение автоматических переменных в памяти или на направление роста стека.
• Указатели на функции могут иметь размер, отличный от размера указателя
• Из-за вопросов выравнивания вы не можете записывать ни один объект по произвольному адресу в памяти.
Просто корректно определите типы, а затем читайте и записывайте данные с использованием указанных типов вместо работы с отдельными битами, словами и адресами. Модель памяти С++ гарантирует эффективную работу, не заставляя вас при этом работать с представлениями данных в памяти. Так и не делайте этого.
[Dewhurst03] §95
92. Избегайте
Как гласит римская пословица, у лжи короткие ноги. Не пытайтесь использовать
Вспомните: Если вы лжете компилятору, он будет мстить (Генри Спенсер).
Преобразование
Кроме того, реальность такова, что результат применения
Некоторые низкоуровневые специфичные для данной системы программы могут заставить вас применить
лучше писать
[С++03] §5.2.10(3) • [Dewhurst03] §39 • [Stroustrup00] §5.6
93. Избегайте применения
К указателям на динамические объекты не следует применять преобразование
Подумайте о замене