包含标签 内存 articles

c++ 调试输出简单封装

#include <windows.h> #include <fmt/printf.h> #include <string> #include <type_traits> template <typename CharType, typename... Args> void GlobalOutputDebugString(const CharType* format, Args... args) { // 使用 fmt::sprintf 格式化字符串 std::basic_string<CharType> formatted = fmt::sprintf(format, args...); // 根据字符类型调用相应的 OutputDebugString 函数 if constexpr (std::is_same_v<CharType, char>) { OutputDebugStringA(formatted.c_str()); } else if constexpr (std::is_same_v<CharType, wchar_t>) { OutputDebugStringW(formatted.c_str()); } } // 这个宏将根据项目设置自动选择正确的字符类型。 // 如果项目设置为使用 Unicode 字符集,那么 _T 和 __FUNCTIONT__ 将解析为 L 和 __FUNCTIONW__。 // 如果项目设置为使用多……

Continue reading

结构体 字节对齐的练习

分析结构体大小 struct S1 { char c1; double d; char c2; char c3; }; struct S2 { char c1; char c2; char c3; double d; }; struct S3 { char c1; S1 s; char c2; char c3; }; 分析结构体大小 #pragma pack(1) struct S1 { char c1; double d; char c2; char c3; }; #pragma pack() struct S3 { char c1; S1 s; char c2; char c3; }; 分析结构体大小 #pragma pack(4) struct S1 { char c1; double d; char c2; char c3; }; #pragma pack() struct S3 { char c1; S1 s; char c2; char c3; }; 分析结构体大小 struct S1 { char c1; double d; char c2; char c3; }; #pragma pack(1) struct S3 { char c1; S1……

Continue reading

C语言 13 结构体数组

结构体数组的定义 类型 变量名[常量表达式]; //定义结构体类型 struct stStudent { int Age; int Level; } //定义结构体变量 struct stStudent st; //定义结构体数组 struct stStudent arr[10]; //或者 stStudent arr[10]; 结构体数组初始化 struct stStudent{ int Age; int Level; }; struct stStudent arr[5] = {{0,0},{1,1},{2,2},{3,3},{4,4}}; //或者 arr[0].Age=100; arr[0].Level=100; 结构体成员的使用 格式 : 结构体数组名[下标].成员名 arr[0].Age = 10; 字符串成员的处理 struct stStudent{ int Age; char Name[0x20]; } struct stStudent……

Continue reading

C语言12 字节对齐

#include char x; short y; int check() { x =1; y=2; return 0; } int main(int argc, char* argv[]) { check(); system("pause"); return 0; } //上述代码中 check 函数的反汇编 13: x =1; 00401038 C6 05 E2 55 42 00 01 mov byte ptr [x (004255e2)],1 14: y=2; 0040103F 66 C7 05 E0 55 42 00 mov word ptr [y (004255e0)],offset check+26h (00401046) //下面将y的类型改为 int #include char x; int y; int check() { x =1; y=2; return 0; } int main(int argc, char* argv[]) { check(); system("pause"); return 0; } //上述代码中 check 函数的反汇编 13: x =1; 00401038 C6 05 E4 55 42 00 01 mov byte ptr [x (004255e4)],1 14:……

Continue reading

C语言11 结构体

思考: 当需要一个容器能够存储1个字节,你会怎么做? //char 当需要一个容器能够存储4个字节,你会怎么做? //int 当需要一个容器能够存储100个2个字节的数据,你会怎么做? //short arr[100] 当需要一个容器能够存储5个数据,这5个数据中有1字节的,2字节的有10字节的。。。你会怎么做?? ===== 结构体 我需要这样的一个……

Continue reading

C语言5 -字符和字符串

int x = 123; //补码 int float f = 123.4F; //IEEE编码 int i = "A"; //神马情况??? 我们在代码中写入 int i = "A"; 反编译后汇编就编程了 mov dword ptr ss:[esp-4],0x41 为什么会变成41呢? 字符类型 ASCII 表 (American Standard Code for Information Interchange 美国标准信息交换代码) 维基百科: https://zh.wikipedia.org/wiki/ASCII 字符类型 ASCII表最大 127 16进制 是 0x7F 也就是只需要一个字节 一个字节就够了,所以通常……

Continue reading

计算机中的运算

计算机只认识0和1,计算机能做的运算归根结底也就是直接对0和1做运算(通常称为 位运算) 与运算 两个位都为1时,结果为1 and(&) 或运算 只要有一个为1 就是1 or(|) 异或运算 不一样的时候是1 xor(^) 非运算(单目运算) 0变1 1变0 not(~) 左移 各二进制位全部左移若干位,高位丢弃,低位补0 shl(>) 在汇编中shr补0,sar……

Continue reading

进制和内存

数据宽度 因为计算机受硬件制约,数据都是有长度限制的(数据宽度),超过最多宽度的数据会被丢弃 计算机中常见的数据宽度: 位(BIT) -> 一个0或1 字节(BYTE) =8位 范围 0-> FF 字(Word) = 16位 0->FFFF 双字(DoubleWord) = 32位 0-FFFFFFFF 超过范围的数会被丢弃 有符号数和无符号数 有符号数还是……

Continue reading

5.汇编-堆栈相关指令

什么是堆栈 程序启动的时候操作系统会给每个程序一块虚拟的4G内存当程序需要使用的时候必须要和操作系统申请内存 堆栈是程序的心脏,程序中需要用到的重要数据,都在堆栈中体现 就是一块特殊的内存,操作系统在程序启动的时候已经分配好的,供程序执行时使用 和数据结构的堆栈无关 查看堆栈 正常内存使用从……

Continue reading

2.汇编-内存

寄存器数量和容量有限,为了存储大量数据,所以我们需要内存 每个程序都会有自己的独立的4GB内存空间( 这里的内存其实是虚拟的,并不是真的给了程序4G内存,当程序读或者写这段内存的时候,操作系统才会把使用的内存映射到物理内存上 物理内存和内存条之间还有一层映射 WX20170916-044017 1Bit 就是一个位 也就是可以存储……

Continue reading