c++学习笔记
Bit
bit
(比特)是信息技术中的基本单位,用于表示数据的最小单位。以下是bit
的含义和用途:
含义
- 二进制数位:
bit
代表二进制数中的一个数位,它只有两个可能的值,通常表示为0或1。这是计算机内部处理信息的基础,因为计算机使用二进制系统。 - 信息单位:在信息理论中,
bit
是衡量信息量的单位。它可以用来表示一个信息源的不确定性或者信息传输过程中的信息量。
用途
- 数据存储:在数据存储中,
bit
是构成更大存储单位的基础,例如字节(byte),1字节等于8比特。 - 数据传输:在网络和通信中,
bit
用于衡量传输速率,例如以每秒比特数(bps)来表示。 - 数据处理:计算机处理器(CPU)的基本操作是在比特级别上进行的,包括逻辑运算(AND, OR, NOT等)和算术运算。
- 编码:在编码和解码过程中,
bit
用于表示不同的符号或信号状态。例如,莫斯电码使用一系列的点和划来表示不同的字符,每个点和划都可以被视为一个比特的信息。
特点
- 简单性:由于
bit
只有两个状态,它非常适合电子电路的实现,因为电子信号通常只有高电平(1)和低电平(0)两种状态。 - 组合性:虽然单个
bit
只能表示两种状态,但通过组合多个bit
,可以表示非常多的不同值。例如,8个bit
可以组合出256(2^8)种不同的状态,这足以表示所有的ASCII字符。
总的来说,bit
是数字信息世界的基础构建块,无论是存储、处理还是传输信息,都离不开bit
的使用。
字节
字节
(Byte)是计算机信息技术中的基本单位,用于计量数据量。以下是关于字节的含义和用途的详细说明:
含义
- 数据单位:字节是一个由8个比特(bits)组成的集合,通常表示为 “8-bit”。每个比特可以取0或1的值,因此一个字节可以表示256(2^8)种不同的状态或组合。
- 字符编码:在许多字符编码方案中(如ASCII),一个字节通常用来表示一个字符。例如,在ASCII编码中,标准的英文字母、数字、标点符号和控制字符都可以用一个字节来表示。
用途
- 存储容量:字节是衡量存储设备(如硬盘、固态硬盘、内存条)容量的基本单位。例如,一个文件的大小通常以字节为单位来表示。
- 数据传输:在网络通信中,字节也是衡量数据传输量的单位。网络速度(如带宽)通常以每秒传输的位数(bps)或字节(Bps)来表示。
- 数据处理:计算机处理器在处理数据时,通常以字节为单位进行操作。例如,读取或写入内存时,通常是按字节进行的。
特点
- 可扩展性:字节可以组合成更大的数据单位,如:
- 1 Kilobyte (KB) = 1,024 bytes
- 1 Megabyte (MB) = 1,024 kilobytes
- 1 Gigabyte (GB) = 1,024 megabytes
- 1 Terabyte (TB) = 1,024 gigabytes
- 依此类推。
- 标准化:字节作为一个标准单位,被广泛应用于计算机硬件和软件中,是数据存储和传输的基本度量。
注意事项
- 大小端序:在不同的计算机体系结构中,多字节数据的存储顺序可能不同,这称为字节序或端序(Endianness)。大端序(Big-Endian)和小端序(Little-Endian)是两种常见的字节序。
- 变长编码:在某些字符编码(如UTF-8)中,字符可能由多个字节表示。这意味着一个字符的字节数量不是固定的,而是根据字符的不同而变化。
字节是计算机科学中的核心概念之一,理解字节对于编写和理解计算机程序至关重要。
c++内存基本概念
在C++中,内存管理是一个核心概念,它直接关系到程序的性能和稳定性。以下是一些关于C++中内存概念的详细介绍:
1. 栈(Stack)
- 局部变量存储:函数内的局部变量通常存储在栈上。
- 自动分配和释放:当函数被调用时,其局部变量在栈上自动分配空间;当函数返回时,这些空间自动释放。
- 大小限制:栈的大小通常有限,不同的系统和编译器有不同的限制。
- 速度快:相对于堆来说,栈的分配和释放速度更快。
2. 堆(Heap)
- 动态内存分配:堆用于动态分配内存,通常通过
new
和delete
关键字进行管理。 - 手动管理:程序员需要显式地分配和释放内存。
- 大小无限制:理论上,堆的大小只受限于系统的虚拟内存。
- 速度慢:相较于栈,堆的分配和释放速度较慢。
3. 全局/静态存储区
- 全局变量和静态变量:存储在此区域的变量在程序启动时分配,在程序结束时释放。
- 生命周期:这些变量的生命周期是整个程序的运行期间。
4. 常量存储区
- 常量存储:用于存储常量,如字符串字面量。
- 只读:这部分内存是只读的。
5. 内存管理关键字和函数
new
和delete
:用于在堆上动态分配和释放内存。malloc
和free
:C语言风格的内存分配和释放函数,在C++中也可以使用。new[]
和delete[]
:用于动态分配和释放数组。
6. 内存泄漏
- 未释放内存:如果动态分配的内存没有被适时释放,就会发生内存泄漏。
- 后果:长期运行的程序可能会因为内存泄漏耗尽可用内存。
7. 指针和引用
- 指针:变量,存储另一个变量的地址。
- 引用:变量的别名,通常用来简化代码。
8. 虚拟内存
- 地址映射:现代操作系统通过虚拟内存管理物理内存,为程序提供连续的内存地址空间。
9. 内存对齐
- 数据对齐:为了提高内存访问效率,数据在内存中的位置可能需要按照一定的规则对齐。
10. 构造和析构
- 构造函数:在对象创建时自动调用,用于初始化对象。
- 析构函数:在对象销毁前自动调用,用于清理资源。
理解这些内存概念对于编写高效且安全的C++代码至关重要。正确的内存管理可以避免许多常见的编程错误,如内存泄漏、野指针等。
c++中基本数据类型的内存占用
在C++中,整数的字节数取决于整数类型。以下是C++标准中定义的几种常见整数类型及其通常占用的字节数:
char
:- 通常占用1个字节(8位)。
- 范围通常是 -128 到 127(对于有符号char)或者 0 到 255(对于无符号char)。
short int
或short
:- 通常占用2个字节(16位)。
- 范围通常是 -32,768 到 32,767。
int
:- 通常占用4个字节(32位)。
- 范围通常是 -2,147,483,648 到 2,147,483,647。
long int
或long
:- 在32位系统中通常占用4个字节,在64位系统中可能占用8个字节(64位)。
- 范围依赖于字节数,对于4字节通常是 -2,147,483,648 到 2,147,483,647,对于8字节则是 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
long long int
或long long
:- 通常占用8个字节(64位)。
- 范围是 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
unsigned
类型(例如unsigned int
,unsigned long
等):- 占用的字节数与相应的有符号类型相同,但表示的范围是正数,因为它们不包括符号位。
需要注意的是,C++标准并没有规定这些类型必须占用上述字节数,它只规定了每种类型的最小字节数。实际占用的字节数可能因编译器和平台的不同而有所差异。如果需要确切知道特定平台上某个类型的大小,可以使用C++的sizeof
运算符,例如:
- 占用的字节数与相应的有符号类型相同,但表示的范围是正数,因为它们不包括符号位。
#include <iostream>
int main() {
std::cout << "Size of char: " << sizeof(char) << " byte(s)" << std::endl;
std::cout << "Size of short: " << sizeof(short) << " byte(s)" << std::endl;
std::cout << "Size of int: " << sizeof(int) << " byte(s)" << std::endl;
std::cout << "Size of long: " << sizeof(long) << " byte(s)" << std::endl;
std::cout << "Size of long long: " << sizeof(long long) << " byte(s)" << std::endl;
return 0;
}
这段代码将输出当前平台上各种整数类型所占用的字节数。
在C++中,浮点数类型通常代表实数,并且它们在内存中的占用空间取决于类型。以下是C++标准中定义的几种常见浮点数类型及其通常占用的字节数:
float
:- 通常占用4个字节(32位)。
- 这通常符合IEEE 754单精度浮点数格式。
double
:- 通常占用8个字节(64位)。
- 这通常符合IEEE 754双精度浮点数格式。
long double
:- 占用的字节数因编译器和平台而异。在许多系统上,它可能占用8个字节,但在某些系统上,它可能占用16个字节或更多。
- 这通常用于提供比
double
更高的精度。
以下是C++代码示例,用于确定各种浮点数类型在当前平台上的大小:
#include <iostream>
int main() {
std::cout << "Size of float: " << sizeof(float) << " byte(s)" << std::endl;
std::cout << "Size of double: " << sizeof(double) << " byte(s)" << std::endl;
std::cout << "Size of long double: " << sizeof(long double) << " byte(s)" << std::endl;
return 0;
}
当你运行这段代码时,它会输出当前平台上float
、double
和long double
类型所占用的字节数。
需要注意的是,尽管大多数现代系统遵循IEEE 754标准,但long double
的确切大小和行为可能因编译器和平台而异。在某些系统上,long double
可能只是double
的同义词,或者它可能使用不同的内部表示,提供不同的精度和范围。
程序在内存中的概念
每个程序启动后,系统会将程序加载到内存,并为程序分配上下文空间。
- 作为文件时是一个二进制的文件
- 加载执行时,在内存中的上下文空间(静态常量区.data数据区、代码区.code)
- 静态常量数据区:存放程序以来的各种数据,例如 const char* name = “huahua”; 这个变量的huahua会存放到上下文的数据区,此时name指针指向数据区地址,等等各类程序需要的数据都会放到该区域。
程序启动时,系统会为程序创建一个进程,进程中就包含程序的上下文空间。进程创建完毕后,会接着创建主线程(真正干活的东西)。每个进程最少有一个主线程,主线程对接的则是main对应的入口函数为起点并进行执行。当进程的主线程结束后,整个进程将会进行内存释放和清理,然后退出程序。
每个线程都有线程专有的栈空间(4mb)。
堆空间,简单理解为内存条的整个空间。有操作系统管理和分配。
虚拟空间,内存不够时候把磁盘划分一定区域去当作内存使用。