Выравнивать или не выравнивать массивы символов в стеке?

У меня есть следующий код:

char stats[109]; /* !LINE UNDER QUESTION! */
sprintf(stats,
    "OBJECTS:\n%u/256\n" \
    "BLOCKS:\n%u/" GP_ConstantExpand(Map_MaxLightmaps) "\n" \
    "QUADS:\n%u/" GP_ConstantExpand(Map_MaxLightmaps) "\n" \
    "LIGHTMAPS:\n%u/" GP_ConstantExpand(Map_MaxLightmaps) "\n" \
    "CHECKPOINTS:\n%u/256\n" \
    "HINTS:\n%u/256",
    Map_This_Header.objects, Map_This_Header.blocks, Map_This_QuadCount,
    lmapcount, Map_This_Header.checkpoints, Map_This_Header.hints);

Хорошо ли статически распределять массив из 109 символов (для моего текста достаточно 109), или выравнивание массива по 128 байтам повысит производительность?

Меня не волнует размер файла и использование памяти, для меня важна производительность, мой код должен работать со скоростью 60 FPS на старых компьютерах.

2 ответа

Решение

Я предполагаю, что это слишком сильно связано с оборудованием, на котором будет выполняться код. Мы можем подумать, например, о двух противоположных аргументах, чтобы ответить на это, предполагая, что в стеке вокруг вашего массива будут размещены другие переменные:

  • если вы оставите массив небольшим, это уменьшит количество записей в кэше, используемых для хранения всех часто используемых переменных.
  • если вы выровняете размер на степень два, а адрес массива находится в одном регистре ЦП, вычисление адреса переменной сразу после этого может быть проще в зависимости от режима адресации ЦП. Например, ARM легче кодировать смещение, например 0x12000, чем 0x12001, потому что оно берет битовое поле и смещает его.

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

Если его выравнивание увеличит производительность, компилятор должен выровнять его для вас на соответствующем уровне оптимизации. Это потому, что компилятор может свободно упорядочивать и выравнивать автоматические переменные так, как считает нужным.

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

Другие вопросы по тегам