Преимущество в производительности заключается в том, что нет необходимости повторно открывать файл после прочтения #pragma. С защитой, компилятор должен открыть файл (который может быть дорогостоящим по времени), чтобы получить информацию, что он не должен снова включать его содержимое.
Это теория только потому, что некоторые компиляторы автоматически не открывают файлы, в которых не было прочитанного кода, для каждой единицы компиляции.
В любом случае, это относится не ко всем компиляторам, поэтому в идеале нужно избегать использования #pragma, поскольку кросс-платформенный код вообще не является стандартным / не имеет стандартизированного определения и эффекта. Однако, на самом деле, это действительно лучше, чем охранники.
В конце, лучшее предложение , которое вы можете получить , чтобы быть уверенным в максимальной скорости вашего компилятора, без необходимости проверять поведение каждого компилятора в этом случае, состоит в том, чтобы использовать обе прагмы один раз и охранники.
#ifndef NR_TEST_H
#define NR_TEST_H
#pragma once
#include "Thing.h"
namespace MyApp
{
// ...
}
#endif
Таким образом, вы получаете лучшее из обоих (кроссплатформенность и скорость компиляции справки).
Поскольку он дольше печатается, я лично использую инструмент, который помогает генерировать все это очень хитрым способом (Visual Assist X).