Выделение стека, дополнение и выравнивание

Я много работаю в ASP.NET / VB.NET и считаю ViewState абсолютным кошмаром. Он включен по умолчанию в большинстве полей и вызывает большое количество закодированных данных в начале каждой веб-страницы. Чем больше становится страница с точки зрения элементов управления на странице, тем больше становятся данные ViewState. Большинство людей не обращают на это внимания, но оно создает большой набор данных, который обычно не имеет отношения к задачам, выполняемым на странице. Вы должны вручную отключить эту опцию на всех элементах управления ASP, если они не используются. Это либо так, либо есть пользовательские элементы управления для всего.

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

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

Кстати, вы можете захотеть отредактировать голосование в этой теме, оно может сильно нагреться;)

45
задан 眠りネロク 21 November 2017 в 08:07
поделиться

6 ответов

It's a gcc feature controlled by -mpreferred-stack-boundary=n where the compiler tries to keep items on the stack aligned to 2^n. If you changed n to 2, it would only allocate 8 bytes on the stack. The default value for n is 4 i.e. it will try to align to 16-byte boundaries.

Why there's the "default" 8 bytes and then 24=8+16 bytes is because the stack already contains 8 bytes for leave and ret, so the compiled code must adjust the stack first by 8 bytes to get it aligned to 2^4=16.

47
ответ дан 26 November 2019 в 21:24
поделиться

Семейство инструкций SSEx ТРЕБУЕТ, чтобы упакованные 128-битные векторы были выровнены по 16 байтам - в противном случае вы получите segfault при попытке загрузить / сохранить их. Т.е. если вы хотите безопасно передавать 16-байтовые векторы для использования с SSE в стеке, стек должен быть постоянно выровнен по 16. GCC учитывает это по умолчанию.

12
ответ дан 26 November 2019 в 21:24
поделиться

Я нашел этот сайт , на котором внизу страницы есть приличное объяснение того, почему стек может быть больше. Масштабируйте концепцию до 64-битной машины, и она может объяснить то, что вы видите.

3
ответ дан 26 November 2019 в 21:24
поделиться

LWN have an article on memory alignment, that you may find interesting.

2
ответ дан 26 November 2019 в 21:24
поделиться

The 8 bytes is there because the first instruction pushes the starting value of %ebp on the stack (assuming 64-bit).

-1
ответ дан 26 November 2019 в 21:24
поделиться

ABI Mac OS X / Darwin x86 требует выравнивания стека в 16 байт. Это не относится к другим платформам x86, таким как Linux, Win32, FreeBSD ...

1
ответ дан 26 November 2019 в 21:24
поделиться
Другие вопросы по тегам:

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