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 位及更大尺寸的字节。

类型 char unsigned char signed char 均使用一个字节进行存储和 值表示 。一个字节中的位数可通过 CHAR_BIT std:: numeric_limits < unsigned char > :: digits 获取。

内存位置

一个 内存位置 是指被以下内容占据的存储空间:要么是 对象表示 所占用的 标量类型 对象(且该对象不是 位域 ),要么是长度非零的连续位域序列中的最大连续序列。

注意:语言的多种特性,例如 引用 虚函数 ,可能涉及程序无法访问但由实现管理的额外内存位置。

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 文档 关于 内存模型