Я предполагаю, что ваш интерес идет о основном из поскольку такие решения, как вектор, строка, wstring и т. д., обычно работают даже для взаимодействия с API-интерфейсами C. Я рекомендую научиться использовать их и как их эффективно использовать. Если вам это действительно нужно, вы можете даже написать свой собственный распределитель памяти, чтобы сделать их супер быстрыми. Если вы уверены, что они не то, что вам нужно, вам все равно нечего оправдывать, чтобы вы не писали простую оболочку для обработки этих строковых буферов с помощью RAII для динамических случаев.
С этим из пути:
Проходит буфер в качестве буфера & [0] лучше стиля программирования, чем передача буфера? (Я предпочитаю & буфер [0].)
Нет, я хотел бы рассмотреть этот стиль, чтобы быть немного менее полезным (правда, субъективны здесь), как вы не можете использовать его, чтобы передать нулевой буфер, и поэтому должны были бы сделать исключения из вашего стиля, чтобы передать указатели на массивы, которые могут быть пустыми. Однако это необходимо, если вы передаете данные из std :: vector в API C, ожидая указателя.
Есть максимальный размер, который считается безопасным для стека выделяются буферы?
Это зависит от настроек платформы и компилятора. Простое эмпирическое правило: если вы сомневаетесь в том, что ваш код переполнит стек, напишите его так, как нельзя.
Является статическим буфером (статический char buffer [N];) быстрее? Есть ли еще другие аргументы за или против?
Да, есть большой аргумент против него, и это то, что он заставляет вашу функцию больше не вступать. Если ваше приложение становится многопоточным, эти функции не будут потокобезопасными. Даже в однопоточном приложении совместное использование одного и того же буфера при рекурсивном вызове этих функций может привести к проблемам.
Как насчет использования статического символа char * = новый символ [N]; и никогда не удаляете буфер? (Повторное использование одного и того же буфера каждый звонок.)
У нас все еще есть те же проблемы с повторным подключением.
Я понимаю, что распределение кучи следует использовать, когда (1) имеем дело с большими буферами или (2) максимальный размер буфера неизвестен во время компиляции. Есть Есть ли другие факторы, которые играют в решение о распределении стека/кучи?
Stack unwinding уничтожает объекты в стеке. Это особенно важно для безопасности исключений. Таким образом, даже если вы распределяете память в куче внутри функции, ее обычно следует управлять объектом в стеке (например: умный указатель). /// @ см. RAII.
Предпочитаете, чтобы sprintf_s, memcpy_s, ... варианты? (Visual Studio пытается убедить меня в этом в течение длительного времени, но я хочу второй мнение: р)
MS был прав этих функций, являющихся более безопасные альтернативы, поскольку они не имеют буфер проблемы с переполнением, но если вы пишете такой код так же, как есть (без написания вариантов для других платформ), ваш код будет вступать в брак с Microsoft, поскольку он будет не переносимым.
При использовании статических буферов вы можете использовать тип возвращаемого значения const char *. Это (вообще) хорошая или плохая идея? (Я понимаю, что абонент будет нуждаться сделать свою собственную копию, чтобы избежать, что следующего вызова будет изменить предыдущее возвращаемого значения.)
Я бы сказал, что почти в каждом случай, вы хотите используйте const char * для возвращаемых типов для функции, возвращающей указатель на буфер символов.Для функции, возвращающей изменчивый символ char *, обычно запутывает и проблематично. Либо он возвращает адрес глобальным/статическим данным, которые он не должен использовать в первую очередь (см. Повторное включение выше), локальные данные класса (если это метод), и в этом случае его возвращение разрушает способность класса к поддерживать инварианты, позволяя клиентам вмешиваться в это, но они любят (например: хранимая строка всегда должна быть действительной) или возвращать память, которая была указана указателем, переданным функции (единственный случай, когда можно было бы разумно утверждать, что mutable char * должен быть возвращен).
Что случилось с boost :: filesystem? –
Вы забыли пару строк: 'userName.resize (1024, 'A'); userName.insert (0, «world of buffer overflows!»); ' – bk1e