C/C++
文章平均质量分 66
taoyuanforrest
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++ 内存布局 - Part5: 继承关系中 构造析构与vptr的调整
当delete这个派生类对象时,首先执行派生类的析构函数,此时对象的vptr仍然执行派生类的虚表,派生类的析构函数会继续执行基类的析构函数,此时对象的vptr会指向基类的虚表。当new一个派生类对象时,首先会执行基类的构造函数,这时这个构造中的对象,其vptr指向基类的虚表,当基类部分构造完毕,继续执行派生类的构造函数时,此时对象的vptr指向派生类的虚表。从结果中可以看到, 在执行Base部分的构造和析构时,vptr指向的是基类的虚表,指向Derived部分的构造和析构时,vptr指向的是派生类的虚表。原创 2024-10-14 11:35:45 · 381 阅读 · 0 评论 -
C++ 内存布局 - Part4: 多继承与this指针调整
可见,Base2中被重写的Derived::fooC() 函数指针被放到了_vptr.Base1虚表之中,没有被重写的Base2::fooD() 依然存放在_vptr.Base2。可见,是将指向Base2部分的指针向上偏移16,指向Derived对象的内存起始地址,从而访问到Base1部分虚表里的Derived::fooC()将会对当前的this指针(b2ptr)向上偏移到Derived对象起始地址。原创 2024-08-20 19:45:24 · 654 阅读 · 0 评论 -
C++ 内存布局 - Part3: 隐式转换为基类指针
如果new一个派生类对象,把new之后的指针赋值给基类指针,那这个基类指针指向哪里,一定是这个派生类对象的起始地址吗?【答案】赋值给基类指针以后,这个基类指针会指向派生类对象中这个基类部分的起始地址,编译器自动进行了指针偏移操作。原创 2024-08-16 22:46:43 · 499 阅读 · 0 评论 -
C++ 内存布局 - Part2: 从内存布局角度看类型转换 static_cast, dynamic_cast, reinterpret_cast
开门见山,先把结论写在这里:1)static_cast 在做基类指针和派生类指针之间的转换时,会根据编译时的静态偏移操作指针,但是没有运行期的类型安全检查,程序员需要自己确保类型的正确性,比如派生类指针确实指向了派生类对象。2)dynamic_cast 依赖于虚表做运行期类型检查,适用于有虚函数的类型转换。3)reinterpret_cast是最不安全的类型转换,完全暴力强制转换。原创 2024-08-16 15:19:27 · 1285 阅读 · 0 评论 -
C++ 内存布局 - Part1: typeid, typeinfo及单继承
typeinfo中存储的是关于类型的信息,可以通过以下代码都是在X86_64 Linux中完成,g++编译。可见,在没有虚函数的情况下,即使指针 ptr实际指向的是派生类对象,但是没有虚表的帮助,只能返回编译器静态类型,也就是基类类型。[有虚函数的类继承]原创 2024-08-13 13:51:25 · 785 阅读 · 0 评论 -
C++ 内存布局 - Part6: 虚继承
虚继承可以在菱形继承体系中,防止派生类中有多份重复祖基类内容。如下图所示,如果是常规继承,Class Final中会有两份Class Base的内容。通过虚继承,即Derived1 虚继承自Base, Derived2 也虚继承自Base, 那么Final中将最终保留一份Base部分的内容。原创 2024-10-17 13:34:52 · 1027 阅读 · 0 评论 -
C11与C++11关于Atomic原子类型的异同
头文件C11 使用。C++11 使用。数据类型C11 使用atomic_int等_Atomic类型定义。C++11 使用模板类。初始化C11 推荐使用宏进行初始化,也可以直接赋值。C++11 通过构造函数直接初始化。操作函数C11 使用标准库函数,如。C++11 使用类成员函数,如storeload。编译参数C11 需要使用-std=c11。C++11 需要使用-std=c++11。原创 2024-06-17 09:51:39 · 845 阅读 · 0 评论 -
GNU C 宏构造利器:语句表达式
GNU C 对 C 标准作了扩展,允许在一个表达式里内嵌语句,允许在表达式内部使用局部变量、for 循环和 goto 跳转语句。这样的表达式,我们称之为语句表达式。({ 表达式1;表达式2;表达式3;})语句表达式最外面使用小括号()括起来,里面一对大括号{}包起来的是代码块,代码块里允许内嵌各种语句。语句的格式可以是 “表达式;”这种一般格式的语句,也可以是循环、跳转等语句。跟一般表达式一样,语句表达式也有自己的值。语句表达式的值为内嵌语句中最后一个表达式的值。我们举个例子,使用语句表达式求值。转载 2024-06-14 16:08:05 · 301 阅读 · 0 评论 -
[转载] linux内核中GNU C和标准C的区别
linux 系统上可用的C编译器是GNU C编译器,它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布。GNU C对标准C进行进一步扩展,以增强标准C的功能。转载 2024-06-14 15:09:25 · 245 阅读 · 0 评论 -
C语言 json parser - JSMN
json parser jsmn原创 2023-04-04 11:26:33 · 447 阅读 · 0 评论 -
C++ namespace命名空间
C++ namespace原创 2023-03-09 10:40:10 · 340 阅读 · 0 评论 -
添加动态库运行期搜索目录
gcc - I don't understand -Wl,-rpath -Wl, - Stack Overflow运行时动态库:not found 及介绍-Wl,-rpath_Homejim的博客-优快云博客_rpath原创 2022-01-25 16:27:54 · 398 阅读 · 0 评论 -
gcc/g++区别
1. 下载subversion-deps-1.4.3.tar.gz 和subversion-1.4.3.tar.gzhttp://subversion.tigris.org/downloads/subversion-1.4.3.tar.gzhttp://subversion.tigris.org/downloads/subversion-deps-1.4.3.tar.gz2.解转载 2012-06-09 19:26:25 · 1138 阅读 · 0 评论 -
gcc/g++ inine Function Attributes
准备条件:Hadoop已经安装完毕。从http://flume.apache.org/download.html 下载apache-flume-1.6.0-bin.tar.gz 并解压创建并编辑文件conf/flume-conf.properties,内容如下(这里以netCat为source, HDFS为sink):# example.conf: A single-node Fl原创 2015-08-17 10:10:55 · 1010 阅读 · 0 评论 -
源码安装gcc-4.8.5
1)inplace参数对于操纵dataframe的很多函数来说,都有inplace参数,默认为False,当设为True的时候,会修改原有的df,比如:df.fillna(..., inplace=True),df将会被修改,否则需要使用df =df.fillna(...)2) index比如将第一列设为index:df.set_index([0], inplace=True...原创 2018-10-10 19:03:29 · 801 阅读 · 0 评论 -
glibc内存分配释放示例
glibc内存分配释放示例原创 2018-09-28 11:26:07 · 1881 阅读 · 0 评论 -
进程分配内存的两种方式--brk() 和mmap()
内存分配转载 2018-06-06 11:03:04 · 1085 阅读 · 0 评论 -
C/C++ main函数正确写法
C/C++ main函数正确写法原创 2015-12-10 16:58:05 · 4674 阅读 · 0 评论 -
C/C++混合编译 - C调用C++
C/C++混合编译,C调用C++转载 2014-10-31 09:47:57 · 1696 阅读 · 0 评论 -
sizeof void或者函数
sizeof void or function原创 2013-05-30 14:13:30 · 3860 阅读 · 0 评论 -
C语言整型提升 integer promotion
整型提升是C语言中的一项规定原创 2015-07-28 19:45:18 · 1679 阅读 · 0 评论 -
C语言函数指针与NULL
C语言中,函数指针和普通指针类似,如果定义了一个函数指针,比如int (*fun)(int a,int b); 那么函数指针fun将默认初始化为NULL。注意:1)函数指针不是函数声明,不要混淆。2)C中函数名可以隐式转换为函数指针,但是C++中非静态成员函数无法隐式转换, 因此在C/C++中获取函数指针时最好统一用取地址符&:即函数指针 = &函数名。...原创 2019-10-20 13:46:21 · 3156 阅读 · 0 评论 -
linux内核数据结构 - 其他
linux内核数据结构 - 其他 待续原创 2020-07-06 10:14:34 · 233 阅读 · 0 评论 -
linux内核数据结构 - tree
linux内核数据结构 - tree 待续原创 2020-07-06 10:13:51 · 283 阅读 · 0 评论 -
linux内核数据结构 -map
linux内核数据结构 -map 待续原创 2020-07-06 10:13:20 · 695 阅读 · 0 评论 -
linux内核数据结构 - Queue
linux内核数据结构队列,待续原创 2020-07-06 10:10:59 · 273 阅读 · 0 评论 -
单元测试googletest gmock
一:Mock C code对于c code,gcc 提供了编译链接选项:-Wl,-wrap比如gcc编译时加入链接选项 -Wl,--wrap,malloc,那么函数调用malloc的时候会调用自定义的__wrap_malloc,而原来的malloc会以__real_malloc进行调用。所以程序需要定义一个__wrap_malloc,比如:void* __wrap_malloc(siz...原创 2019-10-24 19:59:05 · 5145 阅读 · 0 评论 -
gdb 常用命令
run/r 运行运行带参数的可执行文件:r 后面接参数,例如:$ gdb executablefile(gdb) r arg1 arg2 arg3continue/c 继续运行next/n 单步运行step/s 如果有函数则进入函数执行finish 跳出当前的函数jump/j 跳转到指定行/地址后继续执行,因此如果在跳转的目标行上如果没有设置断点,会继续往下执行...原创 2018-04-20 17:21:49 · 10377 阅读 · 1 评论 -
C语言标准预定义的宏
C语言标准指定了一些预定义宏, 常用的如下:__DATE__ 进行预处理的日期,表示为Mmm dd yyyy 形式的字符串常量__FILE__ 代表当前源代码文件名的字符串 __LINE__ 代表当前源代码文件中行号的整数常量 __STDC__ 设置为1时,表示该实现遵循C标准 __STDC_HOSTED__ 为本机环境设置为,否则设为0原创 2017-11-02 13:41:19 · 1559 阅读 · 0 评论 -
gdb远程调试release版本
对于线上release版本,由于已经剔除了debug信息,因此无法通过加载符号表来debug程序,但是如果保留了release版本对应的debug版本,那么可以通过debug版本对release版本进行调试。以下假设release.exe是不带调试信息的release版本可执行文件,debug.exe是带调试信息的debug版本可执行文件。如果不是很确定是否包含调试信息,可以通过r原创 2017-06-07 20:14:39 · 1416 阅读 · 0 评论 -
C和C++混合编译 - C++调用C
转自:http://blog.youkuaiyun.com/david_xtd/article/details/7448313通常,在C语言的头文件中经常可以看到类似下面这种形式的代码:[plain] view plain copy print?#ifdef__cplusplusextern"C"{#endif/****转载 2017-05-27 12:54:38 · 914 阅读 · 0 评论 -
C/C++ volatile
我曾经以为CC++中volatile可以保证保证线程可见性,因为Java中是这样的,直到后来阅读Linux内核看到Linus Torvards的一篇文档,他强调了volatile可能带来的坏处“任何使用volatile的地方,都可能潜藏了一个bug”,我为他的“危言耸听”感到吃惊,所以我当时搜索了不少资料来求证CC++ volatile的能力,事后我认为CC++ volatile不能保证线程可见性。假如DMA对内存进行读写操作,总线上也会对事件进行广播,cpu cache也会观测到并采取相应的动作。转载 2016-11-29 15:37:04 · 883 阅读 · 0 评论 -
结构体的内存分配机制
1. 打开UltraISO,“文件”->"打开",打开CentOS的ISO镜像。2.选择"启动光盘"->"写入硬盘镜像",将ISO写入U盘,写入方式选择USB-HDD+或者USB-ZIP+,建议USB-ZIP+,兼容性好。What type of media contains the packages to be installed?选择"Hard drive",4. "Sel转载 2016-09-09 13:37:42 · 829 阅读 · 0 评论 -
ubuntu下codeblocks设置
默认安装的codeblocks是不允许设置快捷键的,必须安装codeblocks-contrib安装方式:sudo apt-get install codeblocks-contrib安装后可以在codeblocks的Settings -> Editor -> Keyboard shortcuts中设置快捷键原创 2014-11-27 16:03:06 · 1786 阅读 · 0 评论 -
C 结构体位域 bit field (小端)
运行环境为X86 64小端:结构体中size最大的元素t0是int, 占四个字节,因此整个结构体是4字节对齐,结构体中的short是两字节对齐。原创 2012-09-16 14:16:11 · 1424 阅读 · 0 评论 -
Doxygen 生成UML类图
Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统。原创 2023-08-16 13:08:59 · 1424 阅读 · 0 评论 -
C++与Java在线程安全的懒汉式单例模式上的差异
对于java而言,可以通过内部类实现单例的延迟加载:public class Singleton { private Singleton() {}; private static class SingletonHolder { private static Singleton instance = new Singleton(); } ...原创 2018-03-09 14:04:30 · 298 阅读 · 0 评论 -
C++ 传值,传引用,传指针区别之汇编解析
C++ 传值,传引用,传指针区别之汇编解析原创 2019-02-28 17:20:56 · 1389 阅读 · 0 评论 -
char*, char[], 字符串初始化之内存布局
先上一段C代码:#include <stdio.h>int a_test = 66;char glob_str_array[] = "Global Heglo String Array!";char *glob_str_pointer = "Global Hegxlo String Pointer!";main(){ a_test = 88; co...原创 2019-02-27 15:32:07 · 4038 阅读 · 0 评论 -
C内嵌AT&T汇编 - X86
原文:https://blog.youkuaiyun.com/littlehedgehog/article/details/2259665https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html内核代码绝大部分使用C 语言编写,只有一小部分使用汇编语言编写,例如与特定体系结构相关的代码和对性能影响很大的代码。GCC提供了内嵌汇...转载 2019-01-16 10:37:03 · 1052 阅读 · 0 评论
分享