Я собираюсь ответить на другой вопрос - "это хорошая идея?" Более серьезное беспокойство, которое я вижу из вашего кода, - это проблемы с алиасами. Я был бы не удивлен (на самом деле, я бы слегка ожидал этого), если бы можно было написать кусок кода с эффектом
- Напишите что-нибудь на
u.refcount
- Напишите что-нибудь на
u.page
- Чтение
u.refcount
- Узнайте, что значение, которое вы прочитали, совпадает с тем, что вы впервые написали
Вы можете насмехаться, но я видел, как это произошло - и если вы не понимаете опасности, потребуется очень много времени для отладки.
Вы можете быть в безопасности с этим конкретным союзом; Я оставлю это кому-то с большим опытом работы с подобными вещами (и / или удобной копией стандарта C), чтобы сделать такое суждение. Но я хочу подчеркнуть, что это то, о чем важно беспокоиться !!!
Существует другая стоимость. Использование объединения в сочетании с «магическим» тестом для обнаружения того, что в нем хранится - особенно тест с использованием специфических для системы фактов - сделает ваш код труднее для чтения, отладки и сопровождения. Вы можете предпринять шаги для смягчения этого факта, но это всегда будет проблемой.
И, конечно, стоимость вашего кода просто не работает, когда кто-то пытается использовать его на странной машине.
Правильное решение, вероятно, состоит в том, чтобы структурировать ваш код таким образом, чтобы единственным кодом, который заботится о компоновке данных, была пара крошечных inline
d подпрограмм доступа, чтобы вы могли легко поменять, как хранить вещи. Организуйте свой код, чтобы использовать флаг времени компиляции, чтобы выбрать какой!
Теперь, когда я сказал все это, вопрос, который я действительно хочу задать (и хочу, чтобы вы привыкли размышлять): "Стоит ли это того?" Вы жертвуете временем, удобочитаемостью кода, простотой программирования и переносимостью. Что вы получаете?
Многие люди забывают задать этот вопрос, и они пишут сложный код ошибки, когда упрощенный, простой в написании и чтении код столь же хорош.
Если вы обнаружили, что это изменение удвоит производительность рутины, требующей много времени, то, вероятно, стоит бороться с этим хаком. Но если вы исследуете это просто потому, что это умный способ сэкономить 8 байтов, то вы должны рассматривать это только как интеллектуальное упражнение.