Ваша задача больше связана с процессором, чем с операциями ввода-вывода. Асинхронное выполнение имеет смысл, когда у вас длинные операции ввода-вывода, т.е. отправка / получение чего-либо из сети и т. Д.
То, что вы можете сделать, это разделить задачу на куски и использовать потоки и многопроцессорность (работать на разных ядрах процессора).
Метод 1: Использование #pragma warning
директива.
#pragma warning
позволяет выборочную модификацию поведения сообщений предупреждения компилятора.
#pragma warning( push )
#pragma warning( disable : 4705 ) // replace 4705 with warning number
ScopeGuard close_guard = MakeGuard( &close_file, file );
#pragma warning( pop )
Этот код сохраняет текущее состояние предупреждения, затем это отключает предупреждение для определенного кода предупреждения и затем восстанавливает последнее сохраненное состояние предупреждения.
Метод 2: Использование обходное решение как следующее. Visual Studio будет счастлива и вы тоже. Это обходное решение используется во многих образцах Microsoft и также в других проектах.
ScopeGuard close_guard = MakeGuard( &close_file, file );
close_guard;
Или можно создать #define
к обходному решению предупреждение.
#define UNUSED_VAR(VAR) VAR
...
ScopeGuard close_guard = MakeGuard( &close_file, file );
UNUSED_VAR(close_guard);
<час> Некоторые пользователи заявили, что представленный код не будет работать, потому что ScopeGuard является определением типа. Это предположение является неправильным.
http://www.ddj.com/cpp/184403758
Согласно Стандарту C++, ссылка, инициализированная с временной ценностью, делает ту временную ценность живой в течение времени жизни самой ссылки.
Можно определить объем предупреждения #pragma вокруг той строки кода только при помощи
#pragma warning(push)
#pragma warning(disable:XXXX)
your code here;
#pragma warning(pop)
, или
#pragma warning(disable:XXXX)
your code here;
#pragma warning(default:XXXX)
можно также использовать UNREFERENCED_PARAMETER(close_guard);
после строки кода выше.
Я предполагаю на практике, я был бы, grudingly пойти с #pragma отключают... или 'НЕИСПОЛЬЗОВАННЫЙ'. Однако как основное правило, код должен содержаться в чистоте предупреждений даже за счет некоторого дополнительного объема. Это должно скомпилировать в нескольких различных компиляторах на различных платформах и операционных системах без предупреждений. Если это не делает, код имеет, к фиксированному так, чтобы это сделало. Поддержание кода, который генерирует предупреждения в gcc - Стенной уровень, не является хорошей идеей.
Предупреждения компилятора являются Вашим другом и должны быть учтены как вопрос или принцип. Даже когда это означает, что вещи должны быть реализованы в немного более большом и большем количестве подробных путей. Платежи за себя в конечном счете как код портируются, сохраняются и живут на навсегда...
Я использую сообщение smink выше и имею только, чтобы добавить, что я придерживаюсь, комментарий рядом с высказыванием #define//раньше подавлял предупреждение [предупреждение числа] в visual studio
Попытайтесь добавить 'энергозависимый' к объявлению ScopeGuard.
Вы могли явно создать объект ScopeGuardImpl1, при условии, что нет такого количества параметров в случаях, Вы используете это, результат нечитабелен. Тем путем Вы избежали бы reference-initialized-with-temporary, который VS, предупреждающему, по-видимому, не удается понять. Стоимость должна записать вещи обычное письмо, вместо того, чтобы получить волшебство шаблона MakeGuard.
Базовая проблема здесь, кажется, действительно, что компилятор действительно не совсем понимает то, в чем Вы идете..., который, кажется, для использования семантики обзора в C++ для получения некоторого кода, названного, когда переменная освобождена, даже когда это не используется.Правильно? Тот механизм сам кажется мне границей... компилятор должен иметь право удалить неиспользуемые переменные, но семантика конструкции C++ действительно портит эти вещи. Никакой другой способ сделать это, которое является меньшим количеством ловкости рук?
Если Ваш объект имеет нетривиальный деструктор, Visual Studio должна не , дают Вам то предупреждение. Следующий код не генерирует предупреждений в VS2005 с предупреждениями, превращенными полностью (/W4):
class Test
{
public:
~Test(void) { printf("destructor\n"); }
};
Test foo(void) { return Test(); }
int main(void)
{
Test t = foo();
printf("moo\n");
return 0;
}
Комментирование деструктора дает предупреждение; код как есть не делает.
Я использовал бы макрос полностью в этом случае:
#define SCOPE_GUARD(guard, fn, param) \
ScopeGuard guard = MakeGuard(fn, param); \
static_cast<void>(guard)
теперь Ваш код хорош и короток:
SCOPE_GUARD(g1, &file_close, file1);
SCOPE_GUARD(g2, &file_close, file2);
Одно преимущество этого подхода состоит в том, что позже можно добавить __LINE__
, __func__
и т.д. для входа защитных действий позже в случае необходимости.
Мы используем:
static_cast<void>(close_guard);
для переменных, на которые жалуется компилятор.
В части VC ++ заголовочные файлы, MS определяет макрос:
#define UNUSED(x) x
используемый как:
ScopeGuard close_guard = MakeGuard( &close_file, file );
UNUSED(close_guard);
, Который заставляет предупреждение замолчать и документирует его.
ну, в этом случае ScopeGuard является на самом деле определением типа к ссылочному типу. Это не работало бы, к сожалению.
Разве, который не означал бы, целый ScopeGuard не работает, потому что в этом случае деструктор не назовут???