![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
Soul·Top
soultop
展开
-
C++ 多重继承之菱形继承
多重继承有如下的多重继承模式例子:#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;class A{public: int _a;};// class B : public Aclass B : public A{public: int _b;};// class C : public Aclass C : public A{public: int _c;};cl原创 2020-08-14 10:45:29 · 214 阅读 · 0 评论 -
条件变量condition_variable 与生产者消费者问题
condition_variable 与 unique_lock 搭配使用。因为 lock_guard 不提供灵活的开锁unlock接口。condition_variable::wait(lck),等到收到通知:当前线程(应已锁定 lck 的互斥锁)的执行被阻塞,直到得到通知为止。在阻塞线程时(wait()):该函数会自动调用 lck.unlock(),从而允许其他锁定的线程继续执行。一旦收到通知(明确地由其他线程通知),该函数将取消阻塞并调用 lck.lock() 上锁,从而使 lck.原创 2020-08-11 15:32:57 · 439 阅读 · 0 评论 -
C++ 一些小功能的快速实现
求一个二进制数中 1 的个数class Soulution{public: int hammingWeight(uint32_t n) { int ans = 0; unsigned int flag = 1; while(flag){ if(flag & n) ans++; flag <<= 1; } return ans; }}判断一个数是不是 2 的幂,不可用循环语句/* 这样的数转换为二进制是 10、100..原创 2020-08-10 19:56:01 · 244 阅读 · 0 评论 -
C++11 多线程编程(三)——条件变量及生产者消费者问题
上一节 讲了互斥锁 mutex。其最为常见,但并发效率不高。一个简单的消费者生产者模型的组成:一个生产者线程向队列中放入数据;一个消费者线程从队列中取数据,取数据前需要判断一下队列中确实有数据。由于这个队列是线程间共享的,所以,需要使用 互斥锁 进行保护,一个线程在往队列添加数据的时候,另一个线程不能取,反之亦然。用互斥锁实现如下:#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <thread>原创 2020-08-09 16:07:45 · 542 阅读 · 3 评论 -
C++11 多线程编程(二)——锁
C++ 的 mutexC++11 中提供了互斥锁 mutex,可以用来对共享资源进行保护。其有两种操作:锁定 lock()与解锁 unlock()。例子:#include <iostream>#include <thread>#include <string>#include <mutex>using namespace std;mutex Mutex;// 使用锁保护// 形成一个线程安全的 print 函数void shared_p原创 2020-08-09 13:15:13 · 344 阅读 · 0 评论 -
C++11 多线程编程(一)
C++11 中提供了多线程的标准库:thread,其提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。一个简单的例子:#include <iostream>#include <thread>void f1(int i) { std::cout << "This is f" << i << " thread" << endl;}int main() { std::thread t1(f1, 1); t1.j原创 2020-08-09 11:48:13 · 191 阅读 · 0 评论 -
malloc 底层实现及Linux内存分配原理
1) malloc 函数实在虚拟地址空间中划分一片区域,而没有与物理页对应。1)当开辟的空间小于 128K 时,malloc 的底层实现是调用 brk()系统调用函数来在虚拟地址空间分配内存,其主要移动指针 _enddata (此时的 _enddata 指的是 Linux 地址空间中堆段的末尾地址,不是数据段的末尾地址,因为堆地址是向高地址增长的。)2)当开辟的空间大于 128K 时,malloc 的底层实现是 mmap() 系统调用函数在 虚拟地址空间中分配空间。这时候不再是单纯的堆高 _endata原创 2020-08-01 19:57:35 · 840 阅读 · 0 评论 -
C/C++ 避免重复定义
加入宏定义:第一种:#ifndef _STUDENT_H #define _STUDENT_H // student.h 中的内容置于此 struct ListNode{ int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} };#endif第二种, 在起始行加入:#pragma once这种方法可移植性较差(编译器可能不支持),并且也不够灵活,因为其只能作用于整个.h文件夹。...原创 2020-07-12 12:45:50 · 1421 阅读 · 0 评论 -
指针作为函数的参数
在 C/C++ 语言中实参和形参之间的数据传输是单向的“值传递”方式,也就是实参可以影响形参,而形参不能影响实参。指针变量作为参数也不例外,但是可以改变实参指针变量所指向的变量的值例子如下:当指针作为形参时,我们仅仅是用于改变指针所指向变量(实参)的值时,这是可以改变的。int a = 3;int *p = &a;void func1(int* val){ *val =...原创 2019-12-27 13:26:53 · 2596 阅读 · 0 评论 -
C++ const关键字
1 const与#define的区别 1. #define是预处理器选项,可能会不被认为是语言的一部分–在预处理阶段就完成了变量名的替换. const是编译器可见的,其占存储空间,位于符号表(symbol table)而不是内存. 在调试时可以"追根朔源". 2. 相较于#define,const更节省内存,其只有一份备份.而#define在程序预处理时,会将程序段中的所有宏进...原创 2019-11-27 11:29:58 · 130 阅读 · 0 评论