
C/C++基础知识
文章平均质量分 95
流左沙
越努力,越幸运
展开
-
C++ 异常是如何实现的
本文内容主要来源于C++ exceptions under the hood,环境为 gcc/x86,原文非常长且专注于实现自己的异常机制,感兴趣可以看原文,本文只针对于原理介绍与术语讲解。1、太长不看版总结编译器会将throw语句翻译成一对libstdc++库里的函数,包括为异常处理分配内存、调用libstdc来进行栈展开(stack unwinding)。 对于每个catch语句的存在,编译器会在函数末尾加上一些特殊信息,包括当前函数可以捕获的异常表,以及清理表(cleanu...原创 2021-09-04 22:00:26 · 1853 阅读 · 0 评论 -
C++ 析构函数的坑
C++ 的析构函数,通常是用来在生命周期结束时释放对象的。最近看到了关于析构函数的一些坑,本文会有介绍,并不是最全的,但也算是一些记录。1、什么时候编译器会生成析构函数?每一个类都会存在析构函数,对于类类型(class type),如struct、class、union这样的,如果没有自定义析构函数,那么编译器就会为它们生成内联(inline)、public 的析构函数。对于一般的类类型而言,通常其生成的析构函数会是空的(empty body),所以在内联之后,直接就等同于消失了。什么时..原创 2021-08-15 18:55:33 · 1257 阅读 · 0 评论 -
跨语言调 C 库:DragonFFI
跨语言调用是很方便实用的操作,但其实现并非想象的那么简单,包含有复杂的 ABI 设计、语言间的兼容交互等,本文将介绍一个跨语言调 C 库:DragonFFI。1、定义在官方 github 仓库中就有相关的说明,DragonFFI是 C 语言的 FFI(Foreign Function Interface,外部函数接口)库,使用 C++ 编写,基于 clang/llvm 来实现。跨语言调用 C ,一般有通过手写胶水代码的(JNI,Python,Ruby)、生成胶水代码的(SWIG)、扩展 C 的.原创 2021-07-10 11:13:21 · 407 阅读 · 0 评论 -
【论文阅读】C++ 二进制插桩检测程序缺陷
本文是对硕士学位论文《基于二进制指令插桩的C++程序缺陷检测技术的研究与实现》的阅读笔记,作者对于 C++ 程序缺陷以及检测手段都有很详细地描述,感兴趣的建议看原论文。1、程序缺陷检测技术手段1.1、静态分析静态分析指不运行程序,直接对应用程序的源代码或者机器码等进行缺陷分析。1.2、动态测试动态测试指通过直接运行程序的方式对应用程序进行缺陷检测。1.3、对比 静态分析 动态测试 优势 可以比较全面覆盖程序所有执行分支 准确率高 劣势 准确.原创 2021-06-19 12:18:30 · 766 阅读 · 0 评论 -
C++ 是如何处理函数符号查找?
在 C++ 的日常开发中,经常会遇到函数冲突或者找不到匹配的函数的问题,如果不了解编译器处理函数符号查找的行为,就很难去解决这些问题。【参考 How C++ Resolves a Function Call -https://preshing.com/20210315/how-cpp-resolves-a-function-call/】1、函数符号查找难点C 语言的函数调用很简单,每个函数都有唯一的名字。但 C++ 就复杂得多了,因为其有:函数重载 (overloading) 运算符.原创 2021-06-05 18:02:32 · 739 阅读 · 0 评论 -
C++20 协程探索
c++ 20 引入了协程的特性,很多其他语言很早就已经有了,c++ 的又会有什么不同呢,本文旨在了解协程的概念以及简单明白底层实现的原理。Three new language keywords:co_await,co_yieldandco_returndefinition当一个函数被阻塞时,一般会切换到其他线程去执行,而线程频繁切换是存在花销的。如果不阻塞,而使用异步回调,会割裂了原来的代码业务逻辑,还会陷入回调地狱难以维护。A coroutine is a generalisa...原创 2021-05-04 23:40:50 · 761 阅读 · 6 评论 -
新式哈希表 - Swiss Tables
在 cpp2017 大会上,google 向我们展示了 swiss tables,一种在使用性能上可以远超std::unordered_map的哈希表。先看测试效果对比,红色的是 stl 的哈希表,蓝色的是 google 初代的哈希表,绿色的正是 swiss table,不论是在小型工程,还是大型工程,对缓存是否命中,swiss table 都有更少的耗时。本文分为两部分,第一部分讲 c++ stl 哈希表的实现,第二部分讲 swiss tables 如何对其进行优化。本文大纲如下:1..原创 2021-05-04 23:28:36 · 1920 阅读 · 0 评论 -
c++ vtable 深入解析
c++ 利用虚函数实现了多态的能力,虚函数涉及到虚指针和虚表,本文将从汇编和虚表深入探索虚函数机制。【之前写过关于 vtable 的分为上下两篇文章,但发现并不好懂,且有一些疏漏的地方,本着要对写出来的东西负责任的态度,所以修改了文章,并整合为一篇。】refer https://www.tuicool.com/articles/iUB3Ebi1、环境x86_64-apple-macos10.15Apple clang version 11.0.0注:不同环境下不同编译器,对于虚表原创 2021-05-04 23:06:30 · 5237 阅读 · 6 评论 -
《深度探索C++对象模型》笔记
本文为《深度探索C++对象模型》笔记,简要大纲如下,预计看完需要 10 分钟左右:1、对象模型1.1、简单对象模型1.2、表格驱动数据模型1.3、c++ 对象模型1.3.1、类对象中的 string 类型1.3.2、多态与切割2、default constructor2.1、copy constructor2.1.1、bitwise copy2.2、NRV - named return value 优化2.3、initialization list 和 constructor2.4、原创 2021-01-23 11:47:45 · 443 阅读 · 2 评论 -
CMU C++ Tips 笔记
偶然发现 CMU 的 wiki,里面有 C/C++ 的编写小技巧和提醒,特意挑了些自以为的重点做了笔记,其中可能还混杂了我在其他地方看到的内容,详细内容 wiki 可以看文末链接。1、preprocessor1.1、universal character namesThe universal character name \Unnnnnnnn designates the character whose 8-digit short identifier (as specified by ISO/IEC原创 2020-12-26 15:09:58 · 371 阅读 · 1 评论 -
c++ 类方法和普通方法调用有何不同?
本文将简单对比分析普通方法和类方法调用的不同之处,测试环境为 MacOS。这里不考虑虚函数和类静态方法,有关虚函数的内容,可以看我以前发的文章。1、域我们知道如果调用的普通方法在前面没有声明或定义,会导致报错:因为 c/c++ 的解析文件的符号顺序是从上往下,所以图中的 test 函数需要挪到 main 函数之前。而类/结构体这种域结构的,方法的顺序并不重要,不影响解析结果:如图,这里的构造方法可以正常地调用到后面的 fun 函数。1.1、符号解析过程简单解释下为什么类中解析符号不会出错原创 2020-12-19 15:09:21 · 752 阅读 · 1 评论 -
c++ goto & label 机制汇编探索
本文将从汇编的层面来探索 goto 机制,提起 goto 可能会引起程序员的恐惧,但面对恐惧才能战胜恐惧,以致可以利用未曾尝试的点。arm gcc 实测void fun(){ label: printf("\n"); goto label;}使用 gcc -E 即只走预处理看看:// 只多了一些头文件的预处理void fun(){ label: printf("\n"); goto label;}使用原创 2020-11-15 12:02:34 · 986 阅读 · 0 评论 -
Main函数中的参数argc,argv的使用详解
作者: 字体:[增加 减小] 类型:转载 时间:2013-05-24 我要评论本篇文章是对Main函数中的参数argc,argv的使用进行了详细的分析介绍,需要的朋友参考下C/C++语言中的main函数,经常带有参数argc,argv,如下: 复制代码代码如下:int main(int argc, char** argv)这两个参转载 2017-07-30 16:30:05 · 622 阅读 · 0 评论 -
c语言中getch,getche,getchar的区别
作者: 字体:[增加 减小] 类型:转载 时间:2013-09-14 我要评论getche() 和getch()很相似,它也需要引入头文件conio.h,那它们之间的区别又在哪里呢?不同之处就在于getch()无返回显示,getche()有返回显示getchar 是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说 ,如果stdin有数据转载 2017-08-30 14:58:13 · 1217 阅读 · 3 评论 -
char str[] 与 char *str的区别详细解析
作者: 字体:[增加 减小] 类型:转载 时间:2013-09-14 我要评论以下是对char str[]与char *str的区别进行了详细的介绍,需要的朋友可以过来参考下复制代码代码如下:char* get_str(void) { char str[] = {"abcd"}; return str;转载 2017-08-30 15:22:22 · 2164 阅读 · 0 评论 -
CFile与CStdioFile的文件读写使用方法详解
作者: 字体:[增加 减小] 类型:转载 时间:2013-09-16 我要评论以下是对CFile与CStdioFile的文件读写使用方法进行了详细的分析介绍,需要的朋友可以过来参考下CFile//创建/打开文件CFile file;file.Open(_T("test.txt"),CFile::modeCreate|CFile::modeNoTrun转载 2017-08-30 15:38:10 · 1011 阅读 · 0 评论 -
C++ 异常处理 catch(...)介绍
作者: 字体:[增加 减小] 类型:转载 时间:2013-09-16 我要评论catch(…)能够捕获多种数据类型的异常对象,所以它提供给程序员一种对异常 对象更好的控制手段,使开发的软件系统有很好的可靠性如果要想使一个catch block能抓获多种数据类型的异常对象的话,怎么办?C++标准中定义了一种特殊的catch用法,那就是” catch(…)”。转载 2017-08-30 15:55:05 · 2542 阅读 · 0 评论 -
C语言中auto,register,static,const,volatile的区别详细解析
作者: 字体:[增加 减小] 类型:转载 时间:2013-09-17 我要评论以下是对C语言中auto,register,static,const,volatile的区别进行了详细的分析介绍,需要的朋友可以过来参考下1)auto这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变转载 2017-08-30 16:11:05 · 376 阅读 · 0 评论 -
C++操作MySQL大量数据插入效率低下的解决方法
投稿:shichen2014 字体:[增加 减小] 类型:转载 时间:2014-07-25 我要评论这篇文章主要介绍了C++操作MySQL大量数据插入效率低下的解决方法,需要的朋友可以参考下通常来说C++操作MySQL的时候,往Mysql中插入10000条简单数据,速度非常缓慢,居然要5分钟左右,而打开事务的话,一秒不到就搞定了!具体实现代码如下:转载 2017-09-16 13:54:12 · 3518 阅读 · 0 评论 -
C/C++基础知识(最终篇)
int a=0;自动变量a,再次调用时重新分配储存空间,即0static int b=1;静态变量b,再次调用保留原值,即b不为1//auto、register表示自动存储 自动存储是变量的默认状态//extern、static表示静态存储 extern为全局说明的标识符 static在第一次调用后,变量变为上次退出函数的值,函数退出后,系统保持其存储空间和数值当局部变量与全局变量同名时,在...原创 2018-05-21 09:39:43 · 2138 阅读 · 0 评论 -
GetChar缓存机制深入剖析
作者: 字体:[增加 减小] 类型:转载 时间:2013-09-13 我要评论以下是对GetChar缓存机制进行了详细的介绍,需要的朋友可以过来参考下与缓存区相关最常见的操作就是字符的输入与输出操作getchar,getc,getch,getche,gets系列函数。第一个例子(与getchar有关):复制代码代码如下:#incl转载 2017-08-30 14:29:26 · 250 阅读 · 0 评论 -
实现fopen支持中文的方法
投稿:shichen2014 字体:[增加 减小] 类型:转载 时间:2014-07-07 我要评论这篇文章主要介绍了VC下实现fopen支持中文的方法,需要的朋友可以参考下VC的fopen函数第一个参数是const char*,一旦遇到中文文件名就难以应付了,如果中文是UTF8编码的话,我们还可以用下列代码将其转换为UNICODE,然后用_wfopen函数打开转载 2017-09-14 12:56:39 · 8719 阅读 · 0 评论 -
new和malloc的区别深入解析
作者: 字体:[增加 减小] 类型:转载 时间:2013-09-10 我要评论以下是分别是对new和malloc的区别进行了详细的分析及介绍,需要的朋友可以过来参考下1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void *malloc(unsigned int num_转载 2017-08-28 15:56:10 · 280 阅读 · 0 评论 -
深入理解数组指针与指针数组的区别
作者: 字体:[增加 减小] 类型:转载 时间:2013-05-26 我要评论本篇文章是对数组指针与指针数组的区别进行了详细的分析介绍,需要的朋友参考下数组指针与指针数组的区别在于:数组指针p是一个指针,而指针数组p是一个存放N个指针变量的数组。一、数组指针int (*p)[n]重点:()优先级高([]、()的优先级是一样的,但它们的方向是从左至转载 2017-08-03 22:42:55 · 279 阅读 · 0 评论 -
C中实现矩阵乘法的一种高效的方法
作者: 字体:[增加 减小] 类型:转载 时间:2013-05-04 我要评论本篇文章介绍了,在C中实现矩阵乘法的一种高效的方法。需要的朋友参考下如何计算矩阵乘法,这个大家都知道。通常情况下,我们都是用以下代码实现的:复制代码代码如下:for(i=0;i for(j=0;j sum=0; fo转载 2017-07-24 13:39:28 · 2502 阅读 · 1 评论 -
C++中汉字字符串的截取
作者: 字体:[增加 减小] 类型:转载 时间:2013-05-03 我要评论C++中汉字字符串的截取,需要的朋友可以参考一下1、复制代码代码如下:const char *str = "test测试test";while(*str){//这里只需要判断第一个字节大于0x80就行了,前提是输入的是合法的GBK字符串//原因在转载 2017-07-23 23:17:10 · 3012 阅读 · 0 评论 -
C 语言restrict 关键字的使用浅谈
作者: 字体:[增加 减小] 类型:转载 时间:2013-04-16 我要评论C 语言restrict 关键字的使用浅谈,需要的朋友可以参考一下C99中新增加了restrict修饰的指针:由restrict修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由restric转载 2017-07-23 14:06:27 · 440 阅读 · 0 评论 -
c++ 尽量不要使用#define 而是用const、enum、inline替换
为什么这么说呢?或许很多程序员已经习惯在文件开始使用大量的#define语句例如:这里程序文件开头有如下#define语句 复制代码代码如下:#define N 10 #define PI 3.14 #define MAX 10000 #define Heigth 6.65 ... ... 假设这里程序运行出错误,而且转载 2017-07-17 21:58:17 · 625 阅读 · 0 评论 -
c语言swap(a,b)值交换的4种实现方法
作者: 字体:[增加 减小] 类型:转载 时间:2013-02-25 我要评论c语言swap(a,b)值交换的4种实现方法,这么好的东西,尽管简单,但值得发表,以此共享。这篇文章所要表述的内容的确很简单,写之前,我纠结了很久:写与不写。平常swap(a,b)值交换,我们基本都是使用第一种方法,对于数学较好的人,可能会想到第二种方法,想到时,一定感觉很好,。对于汇转载 2017-07-20 15:12:45 · 4926 阅读 · 0 评论 -
关于C/C++中typedef的定义与用法总结
作者: 字体:[增加 减小] 类型:转载 时间:2012-12-13 我要评论在C还是C++代码中,typedef都使用的很多,在C代码中尤其是多,typedef与#define有些相似,其实是不同的,特别是在一些复杂的用法上,需要的朋友可以参考下在C还是C++代码中,typedef都使用的很多,在C代码中尤其是多。typedef与#define有些相似,其实是不同转载 2017-07-10 16:10:41 · 698 阅读 · 0 评论 -
C/C++基础知识4
在浮点常量中不要使用空格错误--- 1.56 E+12默认情况下,编译器将浮点常量当作double类型。例如,假设some是一个float变量,你有下面的语句:some = 4.0 * 2.0;那么4.0和2.0被储存为double类型,(通常)使用64为进行储存。乘积运算使用双精度,结果被截为正常的float长度。这能保证计算精度,但是会减慢程序的执行。原创 2017-06-02 00:01:30 · 206 阅读 · 0 评论 -
C/C++基础知识3
priority_queue, vector>, greater > > dq;这是一个优先队列 其中三个模版参数第一个pair是一个双值对,有first和second,用于优先队列的优先级,实际存储的应该是两个点去和来两个的优先级(距离)第二个vector>,是一个双值的容器,存储两个点互相的距离第三个是用于标识这个优先队列排序的,greater是从小到大struct N原创 2017-05-29 23:35:58 · 253 阅读 · 0 评论 -
C/C++基础知识1
按组合键Ctrl+Z令cin的输入函数返回一个0值。函数调用:1、 Typedef类型 函数类型名(形式参数表)例:typedefdouble fun(double,double); funmax,min,average;2、 类型 (*指针变量名)(形式参数表)例:double*f(double,double) f=max;…………原创 2017-05-25 23:57:04 · 244 阅读 · 0 评论 -
C语言中#define与typedef的互换细节详解
作者: 字体:[增加 减小] 类型:转载 时间:2013-05-15 我要评论本篇文章是对C语言中#define与typedef的互换细节进行了详细的分析介绍,需要的朋友参考下复制代码代码如下:#include /**/typedef char * string; int main(void){转载 2017-07-26 19:49:01 · 652 阅读 · 0 评论 -
c语言printf函数的使用详解
作者: 字体:[增加 减小] 类型:转载 时间:2013-05-15 我要评论本篇文章是对c语言中printf函数的使用进行了详细的分析介绍,需要的朋友参考下printf的格式控制的完整格式:% - 0 m.n l或h 格式字符下面对组成格式说明的各项加以说明:①%:表示格式说明的起始符号,不可缺少。②-:有-表示左对齐输出,如省略表示右对齐输出转载 2017-07-26 20:40:52 · 3572 阅读 · 0 评论 -
深入解析C++ STL中的常用容器
作者: 字体:[增加 减小] 类型:转载 时间:2013-09-09 我要评论这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点。STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、stac)STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们转载 2017-08-28 15:41:15 · 196 阅读 · 0 评论 -
深入解析C语言中typedef的四个用途
作者: 字体:[增加 减小] 类型:转载 时间:2013-08-22 我要评论以下是对C语言中typedef的四个用途进行了详细的分析介绍,需要的朋友可以过来参考下用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, 和一个转载 2017-08-27 09:39:25 · 430 阅读 · 0 评论 -
C++中this指针的用法及介绍
作者: 字体:[增加 减小] 类型:转载 时间:2013-08-20 我要评论以下是对C++中this指针的用法进行了详细的分析介绍,需要的朋友可以过来参考下this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子: 复制代码代码如下: void Date::setMonth( int mn )转载 2017-08-27 09:35:11 · 319 阅读 · 0 评论 -
浅谈C++中的string 类型占几个字节
作者: 字体:[增加 减小] 类型:转载 时间:2013-08-13 我要评论本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节在C语言中我们操作字符串肯定用到的是指针或者数组,这样相对来说对字符串的处理还是比较麻烦的,好在C++中提供了 string 类型的支持,让我们在处理字符串时方便了许多。转载 2017-08-22 22:54:18 · 3257 阅读 · 1 评论 -
snprintf函数的用法解析
作者: 字体:[增加 减小] 类型:转载 时间:2013-07-25 我要评论以下是对snprintf函数的具体使用方法进行了详细的分析介绍,需要的朋友可以过来参考下int snprintf(char *restrict buf, size_t n, const char * restrict format, ...);函数说明:最多从源串中拷贝n-1个字转载 2017-08-21 22:50:33 · 658 阅读 · 0 评论