Итак, я углубился в сборку, созданную тремя простыми случаями.ниже;
for(int i=0;i<3;++i) a[i] = 1.0; // case 1
a[0] = a[1] = a[2] = 1.0; // case 2
a.x = a.y = a.z = 1.0; // case 3
Сборка, созданная для случаев 2 и 3, была идентична.Это хорошо, поскольку в случае 2 компилятор дал «замечание» о копировании ссылки на временный (оператор [] переопределяется для моего класса), это подразумевает (поправьте меня, если я ошибаюсь), что компилятор правильно использует оптимизацию возвращаемых значений (RVO).
Однако в случае 1 компилятор выдает замечание, что он векторизовал цикл.Сборка тоже была немного другой.В частности, он содержал этот дополнительный код;
.section .rodata, "a"
.align 16
.align 16
_2il0floatpacket.1:
.long 0x00000000,0x3ff00000,0x00000000,0x3ff00000
.type _2il0floatpacket.1,@object
.size _2il0floatpacket.1,16
_2il0floatpacket.2:
.long 0x00000000,0x3ff00000
.type _2il0floatpacket.2,@object
.size _2il0floatpacket.2,8
Теперь я никогда не работал со сборкой, поэтому я не совсем уверен, что означает этот дополнительный материал, но мне кажется, что компилятор не может векторизовать в этом случае.развернутого цикла или доступа по ссылкам.Также намекает на отсутствие замечания об этом во время компиляции.
Если бы кто-нибудь мог подтвердить это, было бы здорово.