Namespaces
Variants

Memory model

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Определяет семантику хранения данных в компьютерной памяти для целей абстрактной машины C++.

Память, доступная программе на C++, представляет собой одну или несколько непрерывных последовательностей байтов . Каждый байт в памяти имеет уникальный адрес .

Содержание

Байт

Байт — это наименьшая адресуемая единица памяти. Он определяется как непрерывная последовательность битов, достаточно большая для хранения

  • значение любого UTF-8 кодового юнита (256 различных значений) и
(до C++23)
(начиная с C++23)

Подобно C, C++ поддерживает байты размером 8 бит и больше.

Типы types char , unsigned char и signed char используют один байт для хранения и представления значения . Количество битов в байте доступно как CHAR_BIT или std:: numeric_limits < unsigned char > :: digits .

Расположение в памяти

Область памяти — это хранилище, занимаемое объектным представлением либо объекта скалярного типа , не являющегося битовым полем , либо наибольшей непрерывной последовательности битовых полей ненулевой длины.

Примечание: Различные особенности языка, такие как references и virtual functions , могут затрагивать дополнительные области памяти, которые недоступны программам, но управляются реализацией.

struct S
{
    char a;     // область памяти #1
    int b : 5;  // область памяти #2
    int c : 11, // область памяти #2 (продолжение)
          : 0,
        d : 8;  // область памяти #3
    struct
    {
        int ee : 8; // область памяти #4
    } e;
} obj; // Объект «obj» состоит из 4 отдельных областей памяти

Отчеты о дефектах

Следующие отчеты о дефектах, изменяющих поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
CWG 1953 C++98 объекты, занимающие одну и ту же память,
рассматривались как разные области памяти
область памяти
теперь относится к хранилищу

Смотрите также

C documentation для Memory model