Утвержденный синтаксис для необработанного управления указателем

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

У меня есть необработанный указатель памяти, скажем, она уже снята как непустой символ *. В моей архитектуре я могу очень эффективно скопировать память в 64-байтовых блоках, КОГДА IT ВЫРОВНЕННЫЙ К 64-БАЙТОВОМУ блоку. Таким образом, (стандартный) прием - то, что я сделаю, простая копия 0-63 байтов "вручную" в голове и/или хвосте для преобразования копии с произвольного символа* произвольной длины до 64 байтов выровняла указатель с некоторыми несколько 64 байта в длине.

Теперь вопрос, как Вы по закону "исследуете" указатель, чтобы определить (и управлять) его выравнивание? Очевидный путь состоит в том, чтобы бросить его в целое число и просто исследовать биты:

char *pointer=something.
int p=(int)pointer;
char *alignedPointer=(char *)((p+63)&~63);

Отметьте здесь, я понимаю, что alignedPointer не указывает на ту же память как указатель... это - "окруженный" указатель, что я могу обратиться к своей эффективной стандартной программе копии, и я обработаю любые другие байты вначале вручную.

Но компиляторы (оправданно) волнуются в кастинге указателя в целое число. Но как еще я могу исследовать и управлять более низкими битами указателя в ЛЕГАЛЬНОМ C? Идеально так, чтобы с различными компиляторами я не получил бы ошибок или предупреждений.

6
задан SPWorley 17 February 2010 в 23:35
поделиться

4 ответа

Для целочисленных типов, которые достаточно велики для хранения указателей, C99 stdint .h содержит:

Для длин данных есть:

, которые существовали задолго до C99.

Если на вашей платформе их нет, вы можете максимизировать переносимость кода, продолжая использовать эти имена типов и создав для них подходящие typedef .

7
ответ дан 16 December 2019 в 21:39
поделиться

Приведение указателей к целым числам и от них допустимо, но результаты зависят от реализации. См. Раздел 6.3.2.3 стандарта. Намерение, похоже, состоит в том, чтобы результаты были такими, как ожидал бы любой, кто знаком с системой, и действительно, похоже, это обычное дело на практике.

Если рассматриваемая архитектура может эффективно манипулировать указателями и целыми числами взаимозаменяемо, и вопрос только в том, будет ли она работать на всех компиляторах этой системы, то ответ таков: вероятно, так и будет.

(Конечно, если бы я писал этот код, я бы подумал, что он хорош как есть, пока не будет доказано обратное. Мой опыт показывает, что все компиляторы для данной системы ведут себя очень похожим образом на этом уровне; язык ассемблера просто предлагает конкретный подход, который все затем применяют.)

«Вероятно, работает» не очень хороший общий совет, поэтому я предлагаю просто написать код, который работает, окружить его достаточно подходящим #ifdef , что только известный компилятор (-ы) будет компилировать его, а в остальных случаях будет использовать memcpy .

#ifdef редко бывает идеальным, но он довольно легкий по сравнению с другими возможностями. И если требуется поведение, определяемое реализацией, или специфические для компилятора уловки, тогда возможности в любом случае весьма ограничены.

0
ответ дан 16 December 2019 в 21:39
поделиться

Я не думаю, что в прошлом люди так неохотно делали свои собственные бит-бэнг, но, возможно, нынешнее настроение «не трогай это» могло бы способствовать созданию какой-то стандартной библиотеки для выравнивания указателей. Из-за отсутствия какого-то официального API у вас нет выбора, кроме как выполнить операции И и ИЛИ.

1
ответ дан 16 December 2019 в 21:39
поделиться

Вместо int попробуйте тип данных, размер которого гарантированно совпадает с размером указателя (INT_PTR в Win32 / 64). Может быть, компилятор не сильно паникнет. :) Или используйте объединение, если 64-битная совместимость не важна.

0
ответ дан 16 December 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: