Это может быть простой вопрос, я вообще не разбираюсь в шаблонах С++ 11.
У меня есть общий векторный класс, который не является std::vector<T>
по соображениям производительности (очень конкретный код).
Я заметил, что проверка того, является ли T
POD или нет, и, когда это так, выполняет специальные вычисления, намного эффективнее, чем нет:
void vec<T>::clear() {
if (!std::is_pod<T>::value) {
for (int i = 0; i < size; i++) {
data[i].~T();
}
}
size = 0;
}
Здесь я не называю деструктор T
для каждого элемента (size
может быть действительно огромным), и производительность действительно повышается. Но тест if (!std::is_pod<T>::value)
бесполезен после компиляции шаблона: вместо компиляции:
void vec<int>::clear() {
if (false) {
for (int i = 0; i < size; i++) {
data[i].~int();
}
}
size = 0;
}
Я хочу, чтобы он был скомпилирован для:
void vec<int>::clear() {
size = 0;
}
Является ли компилятор "умным" достаточно, чтобы пропустить теги if (false)
или if (true)
? Должен ли я писать этот код несколько иначе?