
C/C++
文章平均质量分 67
mw_nice
这个作者很懒,什么都没留下…
展开
-
makefile的链接顺序-c/c++的静态库链接顺序
1.你有一个library或者是可执行文件,你可以这样查看他的依赖关系:readelf -d <> ldd工具2.查看某个. c文件引用了那些头文件 gcc -M :查看引用的全部头文件(包括系统头文件)gcc -MM :忽略系统头文件3.对于library的查找查找需要连接的符号名是从前向后找---即最后一个-l库文件最先调用;根据-L指定的路径顺序查找;不同 目录下的同名的库,只取第一个(从左向右:即依次调用,最后一个生效的是最后调用:即最左...原创 2021-06-10 21:25:03 · 2021 阅读 · 1 评论 -
趣味C代码,不用编译可以直接运行
把下面的文件,保存为easy_c.c文件,chmod赋予执行权限,就可以直接运行//usr/bin/gcc -o mainC "$0" && ./mainC ; rm mainC ; exit#include <stdio.h>int main(int argc, char* argv[]){ printf("hello, easy c\n"); if(argc > 1){ printf("argv[1]: %s\n...原创 2021-03-12 14:38:25 · 1094 阅读 · 0 评论 -
elf文件链接两个so时候,同名函数在两个so里面都有
main.cc文件#include <iostream>using namespace std;extern int common_func(int a1, int a2);extern int old_func(int n);extern int new_func();int main() { cout << "hello" << endl; int n = 1; n = common_func(原创 2021-02-24 15:33:11 · 509 阅读 · 0 评论 -
C++11的6种内存序总结__std::memory_order_acquire_等
对于C++11的6种并发查了不少相关资料,这里作一个总结和理解std::memory_order_relaxed,std::memory_order_consume,std::memory_order_acquirestd::memory_order_release,std::memory_order_acq_rel,std::memory_order_seq_cst粗浅理解(了解大概)...转载 2018-12-06 17:22:25 · 15581 阅读 · 3 评论 -
linux下so动态库调用主程序函数
linux下动态库今天无意间发现在linux下share object(dynamic library)中的函数竟然可以不通过回调的方式直接访问主程序中的函数,瞬间颠覆以前对于动态库的观念.1、如代码所示libhi.so中有一个函数hello, 主程序main中有一个函数hi_out, 那么在main中调用libhi.so中的hello时,hello会自动找到main程序中的hi_output函数地址, 然后进行调用.=================hi.c 编译为 libhi.so=...原创 2020-08-27 10:06:46 · 4506 阅读 · 1 评论 -
在应用程序中替换Linux中Glibc的malloc内存申请的6种方法
打算优化系统的内存分配,接管glibc提供的内存管理,但是整个工程的代码量很大,使用malloc、realloc、calloc和free的地方到处都是,如果自己写好的接口需要重命名所有的调用,先不说工作量,部分没有权限查看代码的.a文件就搞不定了。所以需要替换掉系统的malloc,保证原有调用的名称不变。经过尝试,共有四种方法可以替换,各有优缺点吧。方案1 使用环境变量LD_PRELOAD...原创 2018-12-10 15:04:03 · 2727 阅读 · 1 评论 -
C++ 模板偏特化-来自STL的思考
之前学习STL时接触过一段时间的模板,模板是C++泛型编程编程的基础STL从头到尾都是模板泛型编程,我觉得用的最巧妙的就是在traits萃取技巧时用到的模板偏特化先简要回顾一下模板吧,模板主要分为函数模板与类模板函数模板template<class T>T add(T a, T b) { return a + b;}int main(){ int a = 1, ...转载 2020-04-09 11:16:53 · 255 阅读 · 1 评论 -
C++ #define,typedef,using用法区别
C++ #define,typedef,using用法区别一.#define#define 是宏定义命令,宏定义就是将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替,是预编译命令,因此会在预编译阶段被执行1.无参宏定义无参宏的宏名后不带参数其定义的一般形式为:#define 标识符 字符串其中的“#”表示这是一条预处理命令。凡是以“#”开头的...转载 2019-11-27 11:38:45 · 473 阅读 · 0 评论 -
c++仿函数 functor
内容整理自国外C++教材 先考虑一个简单的例子:假设有一个vector<string>,你的任务是统计长度小于5的string的个数,如果使用count_if函数的话,你的代码可能长成这样:bool LengthIsLessThanFive(const string& str) { return str.length()<5; }int r...转载 2019-11-26 10:45:24 · 178 阅读 · 0 评论 -
c++中函数模板和类模板的 声明与定义 实现放在不同的文件
为什么 c++中函数模板和类模板的 声明与定义需要放到一起?一般来说,模板的声明和定义,都放在同一个头文件里,其它cpp需要用的时候包这个头文件。但是,将模板的声明与定义写在一起实在很不优雅。尝试用“传统”方法,及在.h文件里声明,在.cpp文件里定义,然后在main函数里包含.h头文件,这样会报链接错误。这是因为函数模板要被实例化后才能成为真正的函数,在使用函数模板的源文件...原创 2019-11-07 16:56:46 · 4269 阅读 · 0 评论 -
gcc选项-g与-rdynamic的异同
gcc选项-g与-rdynamic的异同gcc的-g,应该没有人不知道它是一个调试选项,因此在一般需要进行程序调试的场景下,我们都会加上该选项,并且根据调试工具的不同,还能直接选择更有针对性的说明,比如-ggdb。-g是一个编译选项,即在源代码编译的过程中起作用,让gcc把更多调试信息(也就包括符号信息)收集起来并将存放到最终的可执行文件内。相比-g选项,-rdynamic却...转载 2019-10-18 10:29:18 · 1285 阅读 · 0 评论 -
C++面试题答案来了
原文链接:https://www.nowcoder.com/tutorial/93/a34ed23d58b84da3a707c70371f59c21链接:https://www.nowcoder.com/tutorial/93/a34ed23d58b84da3a707c70371f59c21来源:牛客网说一下static关键字的作用参考回答:1. 全局静态变量在全局变量...转载 2019-10-14 10:58:11 · 853 阅读 · 0 评论 -
c++工程师校招面试考点汇总(附面试题和答案)【持续更新】
作者:牛妹链接:https://www.nowcoder.com/discuss/164721来源:牛客网C++后台开发面试考点汇总以下不作为C++学习路径,只是汇总的校招C++后台开发面试考点(因为还有笔试考点,后面结合在一起给大家学习路径),后续会为大家更新10w+字数的C++校招面试题库,还有其他岗位的相关题库和资料,想要什么岗位的可以留言哦~本篇根据各个公司的面试问的问...转载 2019-10-14 10:48:06 · 2456 阅读 · 0 评论 -
C++中const、volatile、mutable的用法
const修饰普通变量和指针const修饰变量,一般有两种写法:const TYPE value;TYPE const value;这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value值不可变。 例如:const int nValue; //nValue是const...转载 2019-02-27 15:29:24 · 146 阅读 · 0 评论 -
c语言函数指针_指针函数_返回值是函数指针
用函数指针作为函数的返回值1.指针函数的定义顾名思义,指针函数即返回指针的函数。其一般定义形式如下:类型名 *函数名(函数参数表列);其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),“类型名”表示函数返回的指针指向的类型”。“(函数...转载 2019-03-06 17:38:43 · 6233 阅读 · 3 评论 -
《C++编程规范:101条规则、准则与最佳实践》学习笔记
《C++编程规范:101条规则、准则与最佳实践》学习笔记转载:http://dsqiu.iteye.com/blog/1688217组织和策略问题0. 不要为小事斤斤计较。(或者说是:知道什么东西不需要标准化)无需在多个项目或者整个公司范围内强制实施一致的编码格式。只要规定需要规定的事情:不要强制施加个人的喜好或者过时的做法。C++不应该使用匈牙利命名法。在有智能指针的情况下,...转载 2019-03-11 10:48:01 · 407 阅读 · 0 评论 -
批量插入头文件脚本__批量执行命令打印内存脚本
#!/bin/bashif [ $# -lt 2 ]; then echo "example:bash insertHeader.sh <list> <dir>" echo " bash insertHeader.sh <insert> <dir>" echo " bash insertHeade...原创 2019-03-12 15:56:16 · 102 阅读 · 0 评论 -
Linux内存泄漏查询方法__proc/pid/status深入解释理解
在测试,特别是性能测试或者系统的稳定性测试中,内存的使用情况是一个很重要的监控点,不管是从资源使用的角度还是从发现内存泄露问题的角度。 如果笼统的来看,大概就是两个指标,系统的内存使用率和进程使用的内存。但是现实世界的事情往往没有那么简单,稍微细一点来看其实有很多的科目。本文不是一个全面的关于内存使用的探讨,甚至也不是一个详细的Linux下面进程内存使用情况的分析,尽管这里的...原创 2019-03-11 16:52:18 · 2513 阅读 · 0 评论 -
C++重写(覆盖)、重载、重定义、多态
1 重写(覆盖)override override是重写(覆盖)了一个方法,以实现不同的功能。一般用于子类在继承父类时,重写(覆盖)父类中的方法。函数特征相同,但是具体实现不同。重写需要注意:被重写的函数不能是static的,必须是virtual的 重写函数必须有相同的类型,名称和参数列表 重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为pu...转载 2019-03-22 15:34:04 · 192 阅读 · 0 评论 -
dynamic_cast和static_cast的异同
dynamic_cast和static_cast是C++中的运行时类型转换运算符,代码如下:class A{public: INT data; virtual void test() {};};class C{public: virtual void show() { }};class B :public A{public: void test()...转载 2019-04-12 17:43:34 · 346 阅读 · 0 评论 -
基于C++11实现线程池的工作原理
目录基于C++11实现线程池的工作原理. 简介 线程池的组成 1、线程池管理器 2、工作线程 3、任务接口, 4、任务队列 线程池工作的四种情况. 1、主程序当前没有任务要执行,线程池中的任务队列为空闲状态. 2、主程序添加小于等于线程池中线程数量的任务. 3、主程序添加任务数量大于当前线程池中线程数量的任务. 4、主程序添加任务数...转载 2019-05-09 16:45:57 · 290 阅读 · 0 评论 -
C/C++中的段错误(Segmentation fault)
Segment fault 之所以能够流行于世,是与Glibc库中基本所有的函数都默认型参指针为非空有着密切关系的。来自:http://oss.lzu.edu.cn/blog/article.php?uid_7/tid_700.html#comment背景最近一段时间在linux下用C做一些学习和开发,但是由于经验不足,问题多多。而段错误就是让我非常头痛的一个问题。不...转载 2019-06-13 09:43:58 · 1531 阅读 · 0 评论 -
c++代码心得体会-关于c++11 完美转发 std::forward()
std::forward右值引用类型是独立于值的,一个右值引用参数作为函数的形参,在函数内部再转发该参数的时候它已经变成一个左值,并不是他原来的类型。如果我们需要一种方法能够按照参数原来的类型转发到另一个函数,这种转发类型称为完美转发。forward可以保持实参的类型、左值右值、是否constforward的原型大致如下template<typename T> ...原创 2019-06-25 16:44:56 · 747 阅读 · 0 评论