自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(168)
  • 资源 (4)
  • 收藏
  • 关注

原创 Intel 64 和 IA-32 架构指令前缀

指令前缀分为四组,每组都有一组允许的前缀代码。对于每条指令,仅包含来自四组(组 1、2、3、4)中的每一组最多一个前缀代码是有用的。第 1 组到第 4 组可以按任何相对彼此的顺序放置。

2023-11-20 20:24:44 254

原创 char* a[]、a[]、a、char** *p++ (*p)++ *++p ++*p详解

(*p)++ 先去指针p指向的值(数组第一个元素2),再将该值自增1(数组第一个元素变为3)++*p 先取指针p指向的值(数组第一个元素2),再将该值自增1(数组第一个元素变为3)a+1 指向数组的第二项(一维为1,其他都为0;eg:三维 a[1] [0] [0])*++p 先将指针p自增1(此时指向数组第二个元素), 操作再取出该值。*p++ 先取指针p指向的值(数组第一个元素2),再将指针p自增1。&a+1 跳过整个数组,指向数组后的第一个地址。*a+1 跳过第一个元素,指向第二个元素。

2023-08-18 10:45:34 808

原创 VS构建项目报错信息及解决办法05

(因为工程中的每个cpp文件属性默认都是使用预编译头(/YU)的,但是添加的第三方文件并没有 #include "stdafx.h" 预编译指示头,所以编译器在此cpp文件中一直到末尾都没有找到它)此错误发生的原因是编译器在寻找预编译指示头文件(默认#include "stdafx.h")时,文件未预期结束。iob_func到__acrt_iob_func的转换函数解决此问题, * 当libjpeg-turbo用vs2015编译时,不需要此补丁文件。属性>C/C++>预编译头>不使用预编译头。

2023-07-26 15:46:18 969

原创 VS构建项目报错信息及解决办法04

符号”是函数或全局变量的内部名称。它是在已编译的对象文件或库中使用或定义的名称形式。全局变量在为其分配了存储的对象文件中进行定义。函数在放置函数体的已编译代码的对象文件中进行定义。“外部符号”是在一个对象文件中引用,但在不同的库或对象文件中定义的符号。“导出的符号”是由定义它的对象文件或库公开提供的符号。链接器必须解析或查找每个对象文件引用的每个外部符号的匹配定义。这意味着链接器在任何链接文件中都找不到匹配的导出符号的定义。编译后的代码引用或调用符号。该符号未在链接器搜索的任何库或对象文件中定义。

2023-07-26 15:42:13 517

原创 VS构建项目报错信息及解决办法03

同样的字节序列,在不同的字符集下表示的字符不一样。由于不同 ANSI 编码所规定的标准是不相同的(字符集不同),因此,对于一个给定的多字节字符串,我们必须知道它采用的是哪一种字符集则,才能够知道它包含了哪些“字符”。为了写程序的方便,微软定义了类型LPTSTR,在MBCS下它表示char*,在Unicode下它表示unsigned char*,这就可以重定义一个宏进行不同字符集的转换了 ​ 3.关系 ​ LPSTR: 指向一个字符串的32位指针,相当于char *;

2023-07-26 15:38:21 1066

原创 VS构建项目报错信息及解决办法02

fatal error C1083: 无法打开包括文件: “dirent.h”: No such file or directory。项目为Linux环境下的,而在windows下VS中的MSVC并没有实现“dirent.h”头文件。自定义头文件并进行添加,头文件链接。

2023-07-26 15:36:00 638

原创 VS构建项目报错信息及解决办法01

1>MSVCRT.lib(exe_winmain.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 "int。在Linux/Unix 系统下编写的C/C++代码需要头文件unistd.h,但Windows 环境下没有该头文件,所以用VS编译会报错。__scrt_common_main_seh@@YAHXZ) 中被引用。应用程序和控制台程序的入口函数不一样,windows程序中WinMain是入口函数,dos控制台程序中main是入口函数。

2023-07-26 15:34:13 391

原创 将EXE文件转化为DLL文件

将属性中的生成改为dll生成完成!

2023-07-05 17:32:08 2562

原创 内存对齐相关

在编写代码时,应注意数据类型和结构体的对齐要求,并考虑对齐对性能和可移植性的影响。可以使用编译器提供的对齐指令来调整数据的对齐方式,以满足特定的需求。结构体对齐:结构体的对齐要求是其成员中最大字节大小的数据类型的对齐要求。如果结构体中的成员的总大小不是对齐边界的倍数,则编译器会在结构体的末尾添加一些空白字节,以使结构体满足对齐要求。例如,C/C++ 中的。指令后,结构体的对齐将按照指定的字节大小进行调整,即结构体的大小必须是指定字节大小的倍数。结构体的对齐要求是其成员中最大字节大小的数据类型的对齐要求。

2023-07-03 12:49:23 150

原创 函数指针及其作用

需要注意的是,虽然函数指针在某些情况下非常有用,但在现代C++中,有一些更高级的技术和工具,如函数对象、Lambda表达式和std::function,可以提供更强大和灵活的函数调用和处理机制。函数的运行时绑定和重载:函数指针可以用于实现函数的运行时绑定,即根据对象的类型动态选择要调用的函数。函数的延迟加载和动态链接:函数指针可以用于实现函数的延迟加载,即在需要时才加载和调用函数。回调函数:函数指针可以用作回调函数的机制,允许在程序运行时动态地指定要调用的函数。它调用传递的函数指针来处理传递的值。

2023-07-03 12:47:25 1156

原创 继承和组合

组合关系是一种强关联关系,被组合的类的对象的生命周期与组合类的对象的生命周期相互依赖。子类可以重写父类的方法,实现自己的行为,同时可以通过父类的引用或指针来访问子类对象,实现多态的效果。通过继承,子类可以获得父类的成员变量和成员函数,并且可以添加自己特定的成员变量和成员函数,以扩展父类的功能或实现自己的特定需求。需要注意的是,组合关系中,被组合的类的对象是作为成员变量直接存在于组合类中的,它们共享同一个命名空间,可以直接访问和使用。继承关系中,子类继承父类的属性和方法,子类可以重写父类的方法,实现多态性。

2023-06-30 08:42:46 747

原创 全局变量和局部变量

全局变量(Global Variable)和局部变量(Local Variable)是两种不同作用域的变量。

2023-06-30 08:42:05 1642

原创 类的静态分配与动态分配

静态分配:由编译器为对象在栈空间中分配内存;动态分配:使用new运算符为对象在堆空间中分配内存。

2023-06-30 08:41:19 249

原创 coredump

需要注意的是,使用gdb调试core dump时,确保可执行文件与生成core dump的代码版本相同,以便还原程序崩溃时的准确状态。此外,如果程序崩溃时的核心转储文件(core dump文件)已经损坏,或者与生成core dump的系统不兼容,那么可能无法成功加载和调试core dump。Core dump是指在程序运行过程中发生了严重错误或崩溃时,操作系统会将程序的内存状态、寄存器值、堆栈信息等保存到一个特殊的文件中,这个文件就是core dump文件。这在调试程序或捕捉特定错误时很有用。

2023-06-30 08:40:57 925

原创 C++函数调用的压栈过程

需要注意的是,栈的管理是由编译器和操作系统来完成的,具体的实现可能有所不同。C++函数调用的压栈过程是指在函数调用时,将函数的相关信息和局部变量等数据存储在栈(Stack)上的过程。上述示例展示了函数调用的压栈过程,包括参数的传递、局部变量的分配和返回地址的保存。在函数调用之前,将下一条指令的地址(函数调用后执行的下一条指令)压入栈中,以便函数执行完后能够返回到正确的位置。函数调用完成后,会按照相反的顺序将栈上的数据出栈,恢复到调用函数的状态,并将控制权返回给调用函数。函数,按照从右到左的顺序压入栈中。

2023-06-29 09:07:55 1153 2

原创 形参、实参以及参数的传递

实参是函数调用时提供的参数的值,用于传递给函数定义中对应的形参。形参的数量和类型必须与实参的数量和类型匹配,即在函数调用时,提供的实参个数和类型要与函数定义中的形参一致。传递实参给形参时,实参的值被复制到形参中,函数内部对形参的修改不会影响实参的值。在函数调用时,实参的地址被传递给形参,函数内部可以通过解引用指针来修改实参的值。在函数调用时,实参的值被复制到形参中,函数内部对形参的修改不会影响实参的值。位置匹配:实参按照形参的顺序进行对应,位置相同的实参传递给对应的形参。

2023-06-29 09:03:34 1980

原创 typeid、static

然而,需要注意静态成员的初始化和访问规则,以确保正确的使用和管理。对于非多态类型或未定义的类型,在函数内部声明的静态变量在程序运行期间保持其值的持久性,即在函数退出后仍然存在。静态函数在类中声明,它们不依赖于任何特定的对象,可以直接通过类名来调用。静态类成员是类的成员变量或成员函数,它们被类的所有对象所共享。是C++中一个关键字,用于指定变量、函数或类成员的静态性质。静态成员可以在类外部初始化,且需要在类外部定义。的成员函数,可以比较类型、获取类型名称等。指向的对象的实际类型,并输出相应的信息。

2023-06-29 09:01:08 147

原创 智能指针(Smart pointers)

std::unique_ptr确保在其生命周期结束时,自动释放所管理的对象,并确保只有一个std::unique_ptr可以拥有对该对象的所有权。std::shared_ptr可以拥有多个std::shared_ptr对象共享对同一对象的所有权,通过引用计数来跟踪对象的使用情况。std::shared_ptr会在最后一个拥有所有权的std::shared_ptr析构时,自动释放所管理的对象。std::shared_ptr是一种共享所有权的智能指针,用于管理共享资源的动态分配内存。

2023-06-29 08:57:41 1024

原创 左值、右值、左值引用、右值引用

需要注意的是,C++11之后,引入了右值引用(Rvalue Reference)和转发引用(Forwarding Reference),在某些情况下可以绑定到左值或右值。总结:右值引用是C++11引入的一种引用类型,用于引用右值。左值引用在函数参数中的使用非常常见,可以用于传递对象的引用,避免了对象的复制。转发引用是右值引用的一种特殊情况,可以绑定到左值或右值,并用于实现完美转发,即将参数以原样转发给其他函数。左值引用在函数参数中的使用非常常见,可以用于传递对象的引用,避免了对象的复制。

2023-06-28 16:29:32 540

原创 类成员de初始化

在C++中,类的成员可以使用初始化列表(Initialization List)或构造函数体内的赋值语句进行初始化。

2023-06-28 16:00:48 189

原创 重载(Overloading)、覆盖(Override)和隐藏(Hide)

重载允许在同一作用域内定义具有相同名称但不同参数的函数。覆盖允许在派生类中重新定义基类中的虚函数,以改变其行为,实现运行时多态性。隐藏在派生类中定义与基类同名但参数不同的函数,隐藏了基类的函数,使得无法动态调用派生类中的同名函数。

2023-06-28 09:25:51 628

原创 顶层const和底层const

顶层const和底层const的区别在于它们所修饰的是指针或变量本身还是所指向的对象。顶层const表示指针或变量本身是常量,而底层const表示指针或引用所指向的对象是常量。这两种const修饰符可以组合使用,形成不同的const类型,以满足不同的需求。顶层const(top-level const)和底层const(low-level const)是C++中用于描述const修饰符的两个概念。const int *a,其中a为指向int型变量的指针,const在 * 左侧,表示a指向不可变常量。

2023-06-28 09:07:34 787 1

原创 宏定义define和typedef的区别

typedef关键字后面跟着的是原有的类型名,然后是新的类型名。总的来说,宏定义和typedef是用于创建别名的不同机制,它们在功能和使用方式上有所不同,开发者可以根据具体的需求和上下文选择合适的方式来创建别名。宏定义是在预处理阶段进行替换的,它可以包含任意的代码片段和表达式。宏定义是在预处理阶段进行文本替换的,而typedef是在编译阶段为类型创建别名。宏定义可以包含任意的代码片段和表达式,而typedef只能用于为类型创建别名。宏定义没有类型检查,而typedef创建的别名是类型安全的。

2023-06-27 09:00:24 212

原创 strlen和sizeof区别

它可以用于获取数据类型的大小,也可以用于获取数组、结构体、指针等对象的大小。操作符返回的是对象或类型所占用的字节数,因此在计算数组的大小时会包括数组元素的个数乘以每个元素的大小。可以用于获取数据类型的大小,也可以用于获取数组、结构体、指针等对象的大小。计算的是对象或类型所占的字节数,包括终止空字符(对于字符数组)。是C/C++中用于获取字符串长度和内存大小的两个不同的操作。函数只计算字符串的长度,不包括字符串的终止空字符。计算的是字符串的长度,不包括终止空字符。是一个函数,用于计算字符串的长度。

2023-06-27 09:00:00 227

原创 页表 TLB Cache 的协同工作

从它们的关系来看,TLB和Cache共同提高内存访问性能。如果在 TLB 中找到翻译,则检索相应的物理地址。然后,检查高速缓存中是否有与该物理地址关联的数据。如果在缓存中找到数据,则可以快速检索。如果发生 TLB 或高速缓存未命中,则需要分别从页表或主存储器获取必要的转换或数据。总而言之,页表提供虚拟地址和物理地址之间的映射,TLB 缓存最近访问的虚拟到物理地址转换以加速内存访问,缓存存储频繁访问的数据以减少内存延迟。页表、转换后备缓冲区 (TLB) 和缓存是计算机系统内内存管理和缓存的三个重要组件。

2023-06-27 08:55:32 254

原创 变量声明与定义

在本例中,年龄和薪水分别声明为 int 和 float 类型的变量。综上所述,变量声明是指定变量的类型和名称的过程,而变量定义包括变量的声明和通过分配初始值来初始化变量。1.变量声明: 变量声明是指定变量的类型和名称而不分配初始值的过程。变量声明通常遵循特定的语法,您可以在其中指定变量的类型和名称。在编程中,变量声明和定义是创建和初始化变量所涉及的两个步骤。在这种情况下,年龄和薪水被定义为具有各自类型和初始值的变量。2.变量定义: 变量定义是声明变量并提供初始值的过程。变量定义包括变量的声明和初始化。

2023-06-27 08:55:27 1079

原创 Linux编译产生警告,造成的编译失败处理办法

Linux编译选项[ ] Compile the kernel with warnings as errorsThis option refers to a setting in the kernel compilation process that determines how the compiler should handle warnings.If the option is unchecked and warnings are generated during the compilat

2023-06-27 08:51:26 564

原创 malloc/free和new/delete的区别与联系

分配的内存是以对象为单位的,根据对象的类型进行内存分配。它会自动计算所需的字节数,并在对象的生命周期结束时自动调用析构函数来释放内存。如果需要在内存分配和释放过程中构造和销毁对象,需要手动调用构造函数和析构函数。是C++中的操作符,可以直接用于对象的创建和销毁,不需要进行手动的类型转换。分配的内存是以字节为单位的,需要指定要分配的字节数。它们可以在运行时根据需要分配所需大小的内存,并在不需要时释放内存。都可以用于堆上的内存管理,但使用方式、类型安全性和与对象构造和析构函数的关联方面存在区别。

2023-06-26 16:23:20 408

原创 指针和引用的区别与联系

指针是一个变量,存储其他变量的内存地址,可以重新赋值和具有空值;引用是一个变量的别名,必须在定义时初始化,不能重新赋值和具有空值。指针存储变量的地址,可以进行指针运算和解引用;引用不存储地址,直接绑定到已存在的变量上,可以直接使用原始变量的名称。指针和引用都可以作为变量的别名,通过它们来访问和修改原始变量。指针和引用都可以作为函数参数传递,实现对函数外部变量的修改,但传递方式和语法略有不同。指针可以用于遍历数组,引用不是一个独立的变量,不能直接用于遍历数组。都是地址的概念;

2023-06-26 16:05:33 362

原创 a与&a的区别与联系

如果。

2023-06-26 15:20:16 2815

原创 tmux终端复用器

我们使用命令行时,打开一个终端窗口,会话开始,执行某些命令如npm run dev,关闭此终端窗口,会话结束,npm run dev服务会话随之被关闭。在终端窗口上,运行tmux,其实就打开了一个终端与tmux服务的会话。只不过我们可以在tmux会话上层,再次输入’会话‘命令,使tmux上层运行的'会话'与终端窗口进行分离。关闭终端窗口再打开,会话并不终止,而是继续运行在执行。将会话与终端窗后彻底分离。启动tmux后,底部[0] 表示第0个tmux伪窗口,再启动一个tmux伪窗口,则为[1],依次递增。

2023-06-26 14:58:04 108

原创 ELF文件中得section(.data .bss .text .altinstr_replacement、.altinstr_aux)

在计算机编程中,.data .text和 .bss 部分是程序内存布局的特定段,通常出现在 C 和 C++ 等编译语言中。.data 部分用于存储初始化的全局变量和静态变量。这些变量被分配一个初始值或由程序员显式初始化。该部分中存储的数据在程序执行过程中一直保留。存储在 .data 部分中的变量示例包括具有指定值的全局变量,例如整数、浮点数和字符数组。.bss(由符号启动的块)部分用于存储未初始化的全局变量和静态变量。这些变量未分配任何初始值,并由系统隐式初始化为零或空值。

2023-06-26 14:56:10 294

原创 四个强制类型转换reinterpret_castconst_caststatic_cast dynamic_cast及比较

然后我们使用“reinterpret_cast”创建一个指向浮点数“fp”的指针,它获取“i”的地址并将其视为指向“浮点数”的指针。它可用于相关类型之间的转换,例如将派生类指针转换为基类指针,或执行算术转换,例如将整数转换为浮点数。我们还有一个基类“Base”和一个派生类“Derived”,并创建一个“Derived”类型的新对象并将其赋值给一个“Base*”类型的指针。我们使用“static_cast”将“i”转换为浮点数“f”,这是安全的,结果是“f”的值为 42.0。

2023-06-14 10:09:53 1515 1

原创 PHI Instruction&&PHI Node

在这种情况下,我们合并 `%x`(在 `ifblock` 块中添加到 `%a` 的值)和 `%y`(在 `elseblock` 块中从 `%a` 减去的值)得到 最终结果“%result”。PHI 节点告诉编译器在循环尚未开始时使用在 entry 块中初始化为 0 的 %a 的值,并使用 %j 的值( % 当循环至少运行一次时,i` 加上 1) 来自 `body` 块。在这种情况下,我们使用 `[ 0, %entry ]` 和 `[ %j, %body ]` 作为 `exit` 块的值块对。

2023-06-14 09:10:35 737

原创 LLVM---Annotation

LLVM通过在函数定义上使用annotation(注解),可以在编写源语言程序时控制LLVM在某个函数上的使用,或者禁止某些pass。这种方式为编程人员提供很大的灵活性。一个名为“foo”的 C 函数,它接受一个整数参数“x”并返回一个整数值。该函数还包括一个属性注释,用于向函数的元数据添加注释。在本例中,注解是“hello”。生成的函数具有“hello”的属性注释,分析或记录代码的工具可以使用它。注解不影响函数本身的行为。

2023-06-13 17:16:41 144

原创 ldd&objdump

阅读 `objdump` 的手册页并尝试不同的选项和输出格式以找到对您的目的最有用的信息非常重要。`ldd` 命令是了解二进制可执行文件或进程的依赖关系的有用工具,但它也可能受到版本冲突、库路径和符号链接等问题的限制。`ldd` 是类 Unix 操作系统中的命令行实用程序,用于显示有关二进制可执行文件或进程所依赖的共享库的信息。- `-h`:显示有关文件节标题的信息,例如它们的名称、大小和地址。- `-t`:显示文件的符号表,显示已定义符号的名称和地址。- `-r`:启用递归模式,显示库本身的依赖关系。

2023-06-05 17:51:54 549 2

原创 C++ A lambda function

在此示例中,lambda 函数被分配给变量“add”,它可以像任何其他函数对象一样使用。请注意,“auto”关键字用于推断 lambda 函数的类型,它是一个函数对象。:这是一个可选的变量列表,lambda 函数可以从周围的上下文中捕获这些变量。:这是 lambda 函数的返回类型。它是可选的,如果省略,则返回类型从函数体中的 return 语句推导出来。lambda 函数是 C++ 中的匿名函数,可以内联定义并用作函数对象。:这是 lambda 函数采用的以逗号分隔的参数列表。返回森林中的每棵树。

2023-05-30 09:53:59 579

原创 在XXX文件中查找每行的string是否在XXX文件中出现(脚本)

在此示例中,脚本读取“input.txt”文件的每一行并从中删除所有空白字符。然后它使用 grep 命令在“example.ll”文件中搜索字符串。如果找到该字符串,脚本会输出一条消息,指示在 LLVM IR 文件的哪一行找到该字符串。请注意,此脚本假定 LLVM IR 文件采用有效文本格式,并且搜索字符串区分大小写 .

2023-05-29 15:51:52 65

原创 static_cast和dynamic_cast的使用

然后我们使用 `dynamic_cast` 将 `Base*` 指针转换为 `Derived*` 指针。在此示例中,我们使用 `static_cast` 将 `int` 变量 `a` 转换为 `double` 变量 `b`。总之,`static_cast` 用于可以在编译时检查的类型转换,而 `dynamic_cast` 用于在运行时在多态类型之间进行安全向下转换。`static_cast` 和 `dynamic_cast` 都是 C++ 中的转换运算符,但它们用于不同的目的并且具有不同的行为。

2023-05-18 15:21:52 641

原创 setjmp()、longjmp()

当 `foo()` 调用 `longjmp()` 时,控制权被转移回调用 `setjmp()` 的地方,并且 `setjmp()` 的返回值被设置为 `1`。`setjmp()` 用于将当前执行上下文保存在 `jmp_buf` 对象中,稍后可以由 `longjmp()` 使用将控制权转移回保存的上下文。这表明 `setjmp()` 调用保存了当前执行状态,`foo()` 函数调用 `longjmp()` 跳回到这个保存的状态,然后程序从 `setjmp( )` 被调用。该对象用于存储当前程序执行状态。

2023-05-17 16:09:14 192

Tutorial-Bridgers-LLVM-IR-tutorial

介绍讲解llvm IR

2023-02-21

北工大考研893真题.zip

北工考研893(14-19真题)

2021-04-14

ubuntu-12.04.4-server-amd64.iso

ubuntu镜像

2021-04-14

数据库系统概论第5版答案(王珊版).doc

数据库系统概论第5版答案(王珊版).doc

2021-04-14

数据库系统教程习题答案(施伯乐)(第2版)-数据库原理及应用.doc

数据库系统教程习题答案(施伯乐)(第2版)-数据库原理及应用.doc

2021-04-14

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除