Spec-Zone.ru › C++

std::memset, std::memset_explicit

Определён в заголовочном файле <cstring>
void* memset( void* dest, int ch, std::size_t count );
(1)
void* memset_explicit( void* dest, int ch, std::size_t count );
(2) (начиная с C++26)

Копирует значение static_cast<unsigned char>(ch) в каждый из первых count символов объекта, на который указывает dest.

Вызов memset_explicit всегда приводит к записи в память (то есть запись никогда не устраняется), независимо от оптимизаций.

(начиная с C++26)

Если объект, на который указывает dest, удовлетворяет любому из следующих условий, поведение не определено:

  • Объект является потенциально перекрывающимся подобъектом.
  • Объект не является TriviallyCopyable.
  • count больше размера объекта.

Параметры

dest - указатель на заполняемый объект
ch - байт-заполнитель
count - количество заполняемых байтов

Возвращаемое значение

dest

Примечания

std::memset может быть удалена оптимизатором (в соответствии с правилами as-if), если к изменённому этой функцией объекту больше не обращаются до конца его времени жизни (например, ошибка GCC 8537). По этой причине эту функцию нельзя использовать для очистки памяти (например, для заполнения нулями массива, в котором хранился пароль).

Для std::memset_explicit эта оптимизация запрещена: гарантируется, что они выполняют запись в память. До C++26 для работы с volatile-указателями можно использовать std::fill.

Сторонние решения для этой задачи включают FreeBSD explicit_bzero и Microsoft SecureZeroMemory.

Пример

#include <bitset>
#include <climits>
#include <cstring>
#include <iostream>

int main()
{
    int a[4];
    using bits = std::bitset<sizeof(int) * CHAR_BIT>;
    std::memset(a, 0b1111'0000'0011, sizeof a);
    for (int ai : a)
        std::cout << bits(ai) << '\n';
}

Вывод:

00000011000000110000001100000011
00000011000000110000001100000011
00000011000000110000001100000011
00000011000000110000001100000011

См. также

memcpy
копирует один буфер в другой
(функция)
memmove
перемещает один буфер в другой
(функция)
wmemset
копирует заданный широкий символ в каждую позицию массива широких символов
(функция)
fill
присваивает копированием заданное значение каждому элементу диапазона
(шаблон функции и функциональный объект алгоритма)
ranges::fill
(C++20)
fill_n
присваивает копированием заданное значение N элементам диапазона
(шаблон функции и функциональный объект алгоритма)
ranges::fill_n
(C++20)
is_trivially_copyable
(C++11)
проверяет, является ли тип тривиально копируемым
(шаблон класса)
Документация C для memset

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/byte/memset

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API