Я не думаю, что Кнут возражал против 64-битных систем. Он только что сказал, что использование 64-битных указателей в системе с оперативной памятью менее 4 ГБ - идиотизм (по крайней мере, если у вас много указателей, подобных указанным в двойном списке). Я не могу сказать, что я согласен с ним, вот 3 различных способа, которыми можно воспользоваться. Предположим, у вас есть 64-битный процессор, который также может работать в 32-битном режиме, как некоторые Intel Core Duo.
1 - все 32-битное, ОС, APPZ, все они. Таким образом, у вас есть 32-разрядные указатели, но вы не можете использовать дополнительные регистры / инструкции, доступные в 64-разрядном режиме.
2 - все 64-битное, ОС, APPZ, все они. Таким образом, у вас есть 64-битные указатели, и вы можете использовать дополнительные регистры / инструкции, которые доступны в 64-битном режиме. Но так как у вас меньше 4 ГБ оперативной памяти, использование 64-битных указателей кажется идиотским. Но так ли это?
3 - ОС является 64-битной, и ОС интересно следит за тем, чтобы все указатели кода / данных находились в диапазоне 0x00000000 - 0xFFFFFFFF (Виртуальная память !!!). ABI работает очень странным образом: все указатели кода / данных, хранящиеся в памяти / файлах, имеют 32-разрядную ширину, но загружаются в 64-разрядные регистры как расширенные нулями. Если есть место для кода для перехода, компилятор / ABI выполняет необходимые исправления и выполняет фактический 64-разрядный переход. Таким образом, указатели являются 32-разрядными, но APPZ может быть 64-разрядным, что означает, что они могут использовать 64-разрядные регистры и инструкции. Я думаю, что этот процесс похож на thunking; -P
Мой вывод таков: *
Третий вариант показался мне выполнимым, но это не простая проблема. Теоретически это может работать, но я не думаю, что это возможно. И я также думаю, что его цитата «Когда такие значения указателя появляются внутри структуры, они не только тратят впустую половину памяти, они эффективно отбрасывают половину кэша». преувеличено ...