У меня следующая ситуация: есть огромный набор шаблонов, таких как std::vector
, которые будут вызывать memmove()
для перемещения частей массива. Иногда они могут захотеть "переместить" части нулевой длины - например, если хвост массива удален (как std::vector::erase()
), они захотят переместить оставшуюся часть массива, которая будет иметь длину ноль, и этот ноль будет известен во время компиляции (я видел разборку - компилятор знает), но компилятор все равно будет выдавать вызов memmove()
.
В общем, у меня могла бы быть обертка:
inline void callMemmove( void* dest, const void* source, size_t count )
{
if( count > 0 ) {
memmove( dest, source, count );
}
}
но это приведет к дополнительной проверке во время выполнения в случаях, когда count
не известен во время компиляции, что мне не нужно.
Возможно ли каким-то образом использовать __assume hint чтобы указать компилятору, что, если он точно знает, что count
равно нулю, он должен исключить memmove()
?
memmove
в GNU)? - person Nim   schedule 05.10.2011memmove()
, а также (наиболее важная часть), которые позволили бы оптимизировать некоторый код вокруг вызоваmemmove()
- отсутствие вызова означает, что подготовка его аргументов не требуется. Да, он микро, но экономит микросекунды. - person sharptooth   schedule 05.10.2011memmove
, когда он уже определил длину 0. На самом деле вызов должен быть встроен, а цикл нулевого размера обнаружен и исключен. Почему этого не происходит? Вы связываетесь с динамической средой выполнения? Если да, напишите оболочку дляmemmove
, похожую на то, что вы написали выше. - person Konrad Rudolph   schedule 05.10.2011memmove()
реализован в сборке в источниках среды выполнения Visual C ++ и не представлен компилятору. - person sharptooth   schedule 05.10.2011