Я не в состоянии получить ошибку при неявном кастинге символа ** к символу константы * константа *, по крайней мере, на MSVC 14 (VS2k5) и g ++ 3.3.3. GCC 3.3.3 проблемы предупреждение, которое я не абсолютно уверен, если это корректно в выполнении.
test.c:
#include <stdlib.h>
#include <stdio.h>
void foo(const char * const * bar)
{
printf("bar %s null\n", bar ? "is not" : "is");
}
int main(int argc, char **argv)
{
char **x = NULL;
const char* const*y = x;
foo(x);
foo(y);
return 0;
}
Вывод с компиляцией как C код: Вывод статьи / TC/w4/wp64 test.c
test.c(8) : warning C4100: 'argv' : unreferenced formal parameter
test.c(8) : warning C4100: 'argc' : unreferenced formal parameter
с компиляцией как код C++: Вывод статьи / TP/w4/wp64 test.c
test.c(8) : warning C4100: 'argv' : unreferenced formal parameter
test.c(8) : warning C4100: 'argc' : unreferenced formal parameter
с gcc: gcc - стенной test.c
test2.c: In function `main':
test2.c:11: warning: initialization from incompatible pointer type
test2.c:12: warning: passing arg 1 of `foo' from incompatible pointer type
Вывод с g ++: g ++ - Стенной тест. C
никакой вывод
Вы можете использовать posix_fadvise ()
с советом POSIX_FADV_DONTNEED
(возможно, в сочетании с вызовами fdatasync ()
), чтобы заставить систему очистить данные и удалить их из кеша.
См. эту статью для практического примера.
Если у вас есть требования к задержке, которые кэш ОС не может удовлетворить сам по себе (планировщик ввода-вывода по умолчанию обычно оптимизируется для пропускной способности, а не для задержки), вам, вероятно, придется управлять собственной буферизацией памяти. Вы сразу же записываете входящие данные? Если да, я бы предложил отказаться от этой архитектуры и перейти к чему-то вроде кольцевого буфера, где один поток (или обработчик мультиплексированного ввода-вывода) записывает с одной стороны буфера, а операции чтения копируются на другую сторону.
В некоторых размерах, этого будет достаточно, чтобы справиться с задержкой, необходимой для пессимальной очистки кэша ОС. Или нет, и в этом случае ваша пропускная способность ограничена, и никакая настройка программного обеспечения не поможет вам, пока вы не получите более быстрое хранилище.
Вы можете настроить параметры кеширования страниц в / proc / sys / vm (см. / proc / sys / vm / dirty_ratio, / proc / sys / vm / swappiness), чтобы настроить кеш страницы по своему вкусу.
Вы можете использовать многопоточный подход - пусть один поток просто читает пакеты данных и добавляет их в файл FIFO, а другой поток удаляет пакеты из FIFO и записывает их на диск. Таким образом, даже если запись на диск остановится, программа может продолжить чтение входящих данных и буферизовать их в ОЗУ.
Если мы говорим о std :: fstream (или любом объекте потока C ++)
Вы можете указать свой собственный буфер, используя:
streambuf * ios :: rdbuf (streambuf * streambuffer );
Определив свой собственный буфер, вы можете настроить поведение потока.
В качестве альтернативы вы всегда можете очищать буфер вручную с заранее установленными интервалами.
Примечание: наличие буфера - это резон. Это быстрее, чем запись на диск напрямую (каждые 10 байт). Очень мало причин для записи на диск кусками, меньшими размера блока диска. Если вы пишете слишком часто, контроллер диска станет вашим узким местом.
Но у меня проблема с тем, что вы используете тот же поток в процессе записи, и вам нужно заблокировать процессы чтения.
Пока данные записываются, нет никаких причин, по которым другой поток не может продолжать читать данные из вашего потока (вам может потребоваться какая-то необычная работа, чтобы убедиться, что они читают / записывают в разные области буфера). Но я не вижу реальной потенциальной проблемы с этим, поскольку система ввода-вывода сработает и будет выполнять свою работу асинхронно (потенциально задерживая ваш поток записи (в зависимости от того, как вы используете систему ввода-вывода), но не обязательно для вашего приложения).