Искам да преместя неподписан тип (напр. size_t) с неотрицателен брой (двоични) цифри / места наляво/надясно, напр.
size_t x;
x << non_const_expr
при предположенията, че стойността на non_const_expr
се вписва в (unsigned) int
и never
причинява недефинирано поведение (стойността му е неотрицателна и не надвишава броя на цифрите в x
). (Имайте предвид, че стойността е неизвестна по време на компилиране.)
Да предположим, че такава промяна се случва в критична за производителността секция (напр. това е единствената операция в най-вътрешния цикъл). Моята трилема е кой тип правилният операнд (връщащият тип на non_consts_expr
) в идеалния случай трябва да бъде за най-бързата операция за преместване:
unsigned int
изглежда най-четлив/интуитивен)int
(AFAIKint
е естественият (и най-бързият?) тип на платформата, докатоunsigned
може да се внедри по по-малко ефективен начин`)- типът на LHS в операцията на смяна (т.е.
size_t
в този случай)
Има ли изобщо значение? Ако да, кой като цяло води до най-бърз код?
std::uint_fast32_t
, ако се притеснявате за производителността на unsigned int типове и това трябва да ви даде бърз. - person Jay   schedule 01.04.2014x
) и всичко останало е UB, повечето (невестулки думи) просто ще използват 5-те LSbits наnon_const_expr
независимо от неговия тип . - person chux - Reinstate Monica   schedule 01.04.2014int
въз основа на 8-те LSBita на броя. Всяка смяна отне 1 цикъл. Така че, ако броят е бил глупаво 255, тази инструкция отнема много време. По този начин се създава огромно време за забавяне в по-лош случай за прекъсвания. Intel разумно използва 4 (или 5) LSBita за следващите процесори. - person chux - Reinstate Monica   schedule 01.04.2014non_const_expr
еднаква ли е стойността вътре в критичната за производителността секция? Ако е така, обадете се на код, който използва фиксирана смяна.if (non_const_expr==5) for(i=n; i>0; i--) { foo1(); x << 5; foo2(); }
. Някак си, в края на деня, просто не виждам оптимизирането на тази смяна ще направи значителна разлика в скоростта. - person chux - Reinstate Monica   schedule 01.04.2014