c/c++
gochenguowei
在工作之余,记录下自己学习的东西,并收藏一些好的文章。
展开
-
线程的查看以及利用gdb调试多线程
转载自:https://blog.csdn.net/zhangye3017/article/details/803824961. 线程的查看首先创建两个线程:#include <stdio.h>#include <unistd.h>#include <pthread.h>#include <stdlib.h>#include &l...转载 2020-05-08 14:59:55 · 913 阅读 · 0 评论 -
int *p = NULL 和*p = NULL 有什么区别?
很多初学者都无法分清这两者之间的区别。我们先看下面的代码:int *p = NULL;这时候我们可以通过编译器查看p 的值为0×00000000。这句代码的意思是:定义一个指针变量p,其指向的内存里面保存的是int 类型的数据;在定义变量p 的同时把p 的值设置为0×00000000,而不是把*p 的值设置为0×00000000。这个过程叫做初始化,是在编译的时候进行的。明白了什么是初...原创 2018-08-22 18:36:27 · 1532 阅读 · 0 评论 -
C++11的6种内存序总结
转自:https://blog.csdn.net/lvdan1/article/details/54098559对于C++11的6种并发查了不少相关资料,这里作一个总结和理解std::memory_order_relaxed,std::memory_order_consume,std::memory_order_acquire std::memory_order_release,std::memo...转载 2018-06-24 20:43:09 · 1174 阅读 · 0 评论 -
C++11 的 lock_guard 和 unique_lock 的简单使用
在 C++1x 之后,我们编写多线程可以直接使用标准库里的函数,不必根据平台的不同使用 posix_thread 之类的库了,这样就实现了跨平台的编程。一、std::lock_guard 的介绍 std::lock_guard 的原型是一个模板类,定义如下:template<class Mutex> class lock_guard; lock_guard 通常用来...原创 2018-06-21 22:42:55 · 11389 阅读 · 0 评论 -
C/C++要点全掌握(五)——mutable、volatile
13、mutable和volatile 很少遇到这两个关键字,学嵌入式估计知道后者,深入研究C++的估计知道前者。 (1)mutable 在C++中,mutable是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中,甚至结构体变量或者类对象为const,其mutable成员也可以被修改。[cpp] v...转载 2018-06-20 22:05:53 · 550 阅读 · 0 评论 -
linux下的静态链接和动态链接(一)
静态链接:静态链接就是,在生成可执行程序的时候,把目标文件.o 和 静态库 .a ,使用 ld 链接器,链接生成一个可执行程序。这是在程序加载前就完成的动作。 动态链接:动态链接就是,在生成可执行程序的时候,只是引用的未定义的符号作了标识,到加载到内存中的时候才进行符号重定位。静态库的生成: 以 Lib.c为例子,代码如下:#include <stdio.h>voi...原创 2018-05-21 21:46:27 · 6951 阅读 · 0 评论 -
logic error string constuct not null
我在 gcc 4.8 版本上编译程序时,在程序的运行时突然抛出了一个 " logic error std::string not null " 的错误。 网上对 "logic error " 的解释: class logic_error此类用作引发报告执行程序前大概可检测的错误(例如,违反逻辑前提条件)的所有异常的基类。class logic_error : publ...原创 2018-04-25 17:13:29 · 170 阅读 · 0 评论 -
C++的静态绑定
今天在 ”高性能服务器开发“ 群里看到一个问题,觉得挺有意思的就记录了下来。 首先讨论的代码如下:class A{public: void prin(void) { cout << "for testing" << endl; }};int main(void){ A *a = NULL; a->prin();...原创 2018-04-07 14:03:09 · 234 阅读 · 0 评论 -
GDB常用调试命令以及多进程多线程调试
转载自:https://blog.csdn.net/freeelinux/article/details/53700266今天把所有的GDB常用的调试命令都过了一遍,尤其是多线程调试。所以先做个总结,以免忘记。以后如果有新的有用的命令会继续追加。 本文地址:(LYanger的博客:http://blog.csdn.net/freeelinux/article/details/53700266...转载 2018-04-07 09:15:29 · 372 阅读 · 0 评论 -
大小端的宏实现
今天无意中看到一道面试题,说怎么实现大小端的转换? 其实,这道题仔细想想,面试官应该向考位运算。 就是怎么把一个整数的高低位的数值调用。//// Created by 陈国威 on 2018/3/26.//#ifndef INTERVIEW_BIG_LITTLE_H#define INTERVIEW_BIG_LITTLE_Htypedef unsigned sho...原创 2018-03-26 22:44:19 · 1373 阅读 · 0 评论 -
谈谈 C/C++ 中的 offsetof
转载自:https://liam0205.me/2018/01/10/a-customized-offsetof-in-Cpp/介绍offsetof 是源自 C 语言的宏,它接受两个参数(类型名和成员名),返回一个 std::size_t 类型的常量表达式。offsetof 的返回值是成员在该类型对象中以字节计算的的偏移量。其中,传入计算的类型名,必须满足标准内存布局的要求;即所有非 static...转载 2018-04-08 14:30:38 · 3631 阅读 · 0 评论 -
c 语言的声明规则
在阅读很多c 语言源代码的时候,我们经常会看到如下的声明char *j[10]; // j 是一个指向数组的指针const int *grape; // 指针所指向的对象是只读int const *grape; // 同上int *grape_jelly; // 指针是只读的(常量指针) 刚开始我们看书的时候,根据书上的介绍,很容易记住上面的定义...原创 2018-03-30 22:38:01 · 454 阅读 · 0 评论 -
c++里的转换函数
我们用的最多的一般是从某类型到类类型之间的转换, 比如 Stone wolf; wolf = 3。这样的转换一般是通过构造函数来隐式转换,也就是Stone(int store)构造函数没有使用explicit关键字。那么如果我们想要 Stone wolf; double wo = wolf 这样的从类类型转换到其他类型,那么就需要使用C++的转换函数了。class Stone{publ...原创 2018-03-25 12:42:27 · 484 阅读 · 0 评论 -
c++的构造函数为什么不能是虚函数,而基类的析构函数必须是虚函数?
构造函数为什么不能是虚函数呢? 首先需要了解 vptr指针和虚函数表的概念,以及这两者的关联。 vptr指针指向虚函数表,执行虚函数的时候,会调用vptr指针指向的虚函数的地址。 当定义一个对象的时候,首先会分配对象内存空间,然后调用构造函数来初始化对象。vptr变量是在构造函数中进行初始化的。又因为执行虚函数需要通过vptr指针来调用。如果可以定义构造函数为虚函数,...原创 2018-03-24 23:19:11 · 10667 阅读 · 0 评论 -
细说new与malloc的10点区别
转载自:http://www.cnblogs.com/QG-whz/p/5140930.htmlnew与malloc的10点区别1. 申请的内存所在位置new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作...转载 2018-03-20 16:53:14 · 439 阅读 · 3 评论 -
malloc 、calloc 和 realloc的区别
转载自:http://blog.csdn.net/zhengqijun_/article/details/52027070一、malloc1.函数原型void *malloc(size_t size); 2.函数功能malloc()在内存的动态存储区中分配一块长度为size字节的连续区域。参数size为需要的内存空间的长度,返回该区域的地址。3.区别malloc不能初始化所分配的内存空间,需要用m...转载 2018-03-22 21:48:42 · 111 阅读 · 0 评论 -
如何定义一个只能在堆上(栈上)生成对象的类
在C++中,类的对象建立分为两种,一种是静态建立,如A a; 另一种是动态建立,如A* ptr = new A; 这两种方式是有区别的。 静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。使用这种方法,直接调用类的构造函数。 动态建立类对象,是使用new运算符将对象建立在堆空间中。这个...原创 2018-03-18 21:14:43 · 157 阅读 · 0 评论