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