Я делаю процедуру копирования блока памяти, и мне нужно работать с блоками необработанной памяти в эффективных кусках. Мой вопрос не в специальной подпрограмме копирования, которую я создаю, а в том, как правильно проверить выравнивание необработанного указателя в C.
У меня есть необработанный указатель памяти, допустим, он уже приведен как ненулевой char *. В моей архитектуре я могу очень эффективно копировать память 64-байтовыми фрагментами, КОГДА ОНА ВЫРАВНИВАЕТСЯ С 64-байтовым фрагментом. Таким образом, (стандартный) трюк заключается в том, что я сделаю простую копию 0-63 байта «вручную» в начале и / или хвосте, чтобы преобразовать копию из произвольного char * произвольной длины в 64-байтовый выровненный указатель с несколькими длиной 64 байта.
Теперь вопрос в том, как юридически «исследовать» указатель, чтобы определить (и управлять) его выравниванием? Очевидный способ - преобразовать его в целое число и просто изучить биты:
char *pointer=something.
int p=(int)pointer;
char *alignedPointer=(char *)((p+63)&~63);
Обратите внимание, здесь я понимаю, что alignPointer не указывает на ту же память, что и указатель ... это указатель с округлением вверх, для которого я могу вызвать мою эффективную подпрограмму копирования, и я буду обрабатывать любые другие байты в начале вручную.
Но компиляторы (справедливо) нервничают при преобразовании указателя в целое число. Но как еще я могу исследовать и управлять младшими битами указателя в LEGAL C? В идеале, чтобы с разными компиляторами не было ошибок и предупреждений.
int
того же размера, что и типы указателя. - person Carl Norum   schedule 18.02.2010memcpy( )
на вашей платформе действительно не настроена для использования этого преимущества? - person Stephen Canon   schedule 18.02.2010memcpy
это как ... самый простой из базовых. Если вы собираетесь оптимизировать что-нибудь вообще, вы оптимизируетеmemcpy
. - person Stephen Canon   schedule 20.02.2010