Размер типов long и int при сравнении строк

348
15 декабря 2017, 00:36

Смотрю на код сравнения строк равной длины, а именно на место, где происходит непосредственно сравнение значений по указателю.

Его суть заключается в том, что за итерацию цикла на AMD64 делается 3 сравнения по 4 символа, а на всех остальных 5 сравнений по 2 символа. Однако, я не могу понять, почему используются типы long и int - ведь это 8 байт и 4 байта соответственно, а не 4 и 2.

    char* a = ap;
    char* b = bp;
#if AMD64
    while (length >= 12)
    {
        if (*(long*)a     != *(long*)b) return false;
        if (*(long*)(a+4) != *(long*)(b+4)) return false;
        if (*(long*)(a+8) != *(long*)(b+8)) return false;
        a += 12; b += 12; length -= 12;
    }
#else
    while (length >= 10)
    {
        if (*(int*)a != *(int*)b) return false;
        if (*(int*)(a+2) != *(int*)(b+2)) return false;
        if (*(int*)(a+4) != *(int*)(b+4)) return false;
        if (*(int*)(a+6) != *(int*)(b+6)) return false;
        if (*(int*)(a+8) != *(int*)(b+8)) return false;
        a += 10; b += 10; length -= 10;
    }
#endif
Answer 1

Дошло. Это же C#, а не C++. Здесь тип char имеет размер 2 байта, а не 1. Поэтому всё верно и long - это 8 байт или 4 символа, а int - это 4 байта или 2 символа.

READ ALSO
Несколько телефонных номеров в ASPxGridView

Несколько телефонных номеров в ASPxGridView

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

279
ASP.NET Core. Защита jwt токенов

ASP.NET Core. Защита jwt токенов

Я использую в своем проекте jwt токеныКод для создания ClaimsIdentity:

396
Вызов функции из dll написанной на Delphi из C#

Вызов функции из dll написанной на Delphi из C#

Есть DLL написанная на DelphiИсходников от нее у меня нет

320
Как сжать List<byte>

Как сжать List<byte>

Во что лучше сжать List, чтобы передать по RPC unity - как таковой list по RPC не передать

261