2016-08-16 9 views
1

Интересно, какие компиляторы предположения делают относительно относительных местоположений объектов памяти.Предположения компилятора относительно относительных местоположений из объектов памяти

Например, если мы выделяем две переменные стека размером по 1 байт, каждый за другим и инициализируем их как нулевыми, может ли компилятор оптимизировать этот случай, испуская только одну команду, которая перезаписывает оба байта в памяти нулями, потому что компилятор знает относительное положение обеих переменных?

Я заинтересован именно в наиболее известных компиляторов как GCC, г ++, лязгом, в Windows, C/C++ компилятор и т.д.

+2

Может ли это? Да, конечно. Будет ли он? Попробуй и посмотри. –

ответ

1

Компилятор может оптимизировать несколько назначений в один.

a = 0; 
b = 0; 

может стать чем-то вроде

*(short*)&a = 0; 

Тонкая часть «если выделить два стек переменного размера 1 байты каждых, сразу после другого», так как вы не можете сделать это. Компилятор может перемещать позиции стека по желанию. Кроме того, просто объявление переменных не обязательно означает распределение стека. Переменные могут быть только в реестрах. В C вам нужно будет использовать alloca, и даже это не дает «право за другим».

Еще более общий, стандарт C не позволяет сравнивать позиции памяти разных объектов. Это неопределенное поведение.

+0

Если стандарт C определяет это как неопределенное поведение, то, например, gcc, соответствуют стандарту и не используют такие оптимизации? – user2600312

+1

@ user2600312 это неопределенное поведение, если * вы * используете такой код. Компилятор может это сделать, если он знает, что он будет работать, что он может знать, потому что он компилирует конкретную цель определенным образом - он может * заставить * работать. – harold