C/C++基础
文章平均质量分 71
整理和收集的一些关于C/C++的基础知识
china_jeffery
持续学习者;
擅长开发开源组件及相关工具;
长期致力于应用各种IT新技术提升生产效率和解决实际问题;
展开
-
C/C++基础概览
(1) sizeof在32位系统下,各类型所占字节数sizeof(char) = 1sizeof(short) = 2sizeof(int) = 4sizeof(unsigned int) = 4sizeof(long) = 4sizeof(long long) = 8sizeof(float) = 4sizeof(double) = 8数组的大小ch...原创 2018-03-03 19:11:47 · 49378 阅读 · 0 评论 -
C++软件开发中“时间”相关操作全攻略
1. 时间概念在日常生活中我们遇到的和时间相关的概念有北京时间、时差、12小时制、24小时制等,在软件开发中我们也经常遇到和时间相关的概念,软件虽说是一个虚拟的事物,但它仍然是来源于生活,不会脱离生活。我们在开发中遇到的时间概念大多可以对应上日常生活中的时间概念,但也有一些是软件作者(如微软等)人为制造的一些概念,如系统时间、文件时间等。格林威治时间(UTC Time)本初子午线原创 2017-11-01 00:04:42 · 83339 阅读 · 0 评论 -
C++ Thunk技术
一. 使用回调函数时遇到的问题在使用Win32 API(如CreateThread等)时我们经常需要传入回调函数,这个回调函数不能是类的成员函数,只能是友元函数或静态函数。为了在回调函数中访问某个类的成员变量或函数,我们通常不得不通过某种方式将该类的This指针传入到回调函数中,从而实现在回调函数中访问类的公有的成员变量或函数。如果有一种方式可以实现将类的成员函数作为回调函数来使用,那么就...原创 2018-02-26 11:05:19 · 54644 阅读 · 1 评论 -
从汇编的角度分析函数调用过程(1)
一. 函数参数传递形式函数的参数传递有2种方式:堆栈方式、寄存器方式。 如果是堆栈方式传递的,就需要定义函数参数在堆栈中的传递顺序,并约定函数被调用之后,由谁来平衡堆栈; 如果是寄存器方式传递的,就需要确定参数存放在哪个寄存器中。 每一种方式都有其优缺点,而且与使用的编程语言有关系,不存在哪种方式好与坏。我们在开发中经常遇到调用约定类型,如__cdecl、stdcall、PASCAL...原创 2018-02-12 11:08:53 · 71752 阅读 · 0 评论 -
从汇编的角度分析函数调用过程(2)
#include <stdio.h>int add(int a, int b) { int c = 0; c = a + b; return c;}int main(){ int r = add(1, 2); return 0;}我们使用Visual Studio 2017编译上面代码,并在在工程配置中将函数调用约定设置为_...原创 2018-02-12 16:56:22 · 74791 阅读 · 1 评论 -
C++默认构造函数
本文围绕3个问题来理解C++的默认构造函数:什么是默认构造函数?默认构造函数什么时候被调用?编译器在什么情况下会生成默认构造函数?一. 什么是默认构造函数?我们一般会认为默认构造函数就是编译器自动生成的那个构造函数,其实这种理解不全面。 准确的说,默认构造函数就是在调用时不需要显示地传入实参的构造函数。根据这个原则,下面2种构造函数都是默认构造函数:class S...原创 2018-02-08 12:43:51 · 81566 阅读 · 4 评论 -
C++虚函数表的应用
我们知道在C++中要调用类的私有方法,我们可以使用友员(friend)的方式。但其实如果我们知道类的定义,完全可以根据该类对象的内存布局来直接调用它的私有函数。本文作为“C++虚函数实现原理”的后续文章,并不打算介绍类的内存布局,本文只介绍如何使用虚函数表的方式来调用该类的私有虚函数。在阅读本文前需要先了解C++虚函数的实现原理,可以先参考:http://blog.csdn.net/chi...原创 2018-02-11 23:11:26 · 69572 阅读 · 1 评论 -
C++虚函数的实现原理
一. 虚函数介绍C++中的虚函数主要是用来实现多态(面向对象的三大特性之一)的。 下面是一个实现多态的错误例子:// 基类//class Base {public: Base() { printf("Call Base::Base()\n"); } ~Base() { } void Name() { ...原创 2017-11-08 22:49:34 · 84065 阅读 · 0 评论 -
MSVC编译器Warnings手册
Warning NumberDescriptionC6001warning C6001: using uninitialized memory C6011warning C6011: dereferencing NULL pointer C6029warning C6029: possibl原创 2017-11-09 10:59:40 · 1560 阅读 · 0 评论 -
__declspec(noreturn)使用
__declspec(noreturn)用于告知编译器该函数没有返回值。使用__declspec(noreturn)声明的函数中,不允许出现return。否则会有警告:warning C4645: 用 "noreturn" 声明的函数具有 return 语句原创 2017-11-10 15:21:33 · 955 阅读 · 0 评论 -
C/C++ enum class枚举类型
声明枚举类型的方式有2种:1. 常见的enum方式enum A { a0 = 0, a1 = 1};enum B { b0 = 0, b1 = 1};2. enum class 方式enum class CC { cc0 = 0, cc1 = 1};enum和enum class的区别如下:1. 使用方式enum声明的枚举可以直接使用枚举原创 2017-11-10 15:40:33 · 85705 阅读 · 0 评论 -
C++11 右值引用&&
一、 新特性的目的右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和精确传递 (Perfect Forwarding)。它的主要目的有两个方面: 1. 消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。 2. 能够更简洁明确地定义泛型函数。原创 2017-11-13 14:43:33 · 95234 阅读 · 4 评论 -
C++ 编译时断言检查
一、 static_assertC++自C++11起支持static_assert编译时断言,static_assert ( bool_constexpr , message ) (C++11 起)static_assert ( bool_constexpr ) (C++17 起)若 bool_constexpr 返回 true ,则此声明没有效果。否则发布一个编译原创 2017-11-13 16:19:18 · 85390 阅读 · 0 评论 -
C++11 智能指针
C++11标准库中提供的智能指针主要有:std::auto_ptr, std::unique_ptr, std::shared_ptr。 std::auto_ptr在C++11中已经标记为弃用,而在C++17中就完全移除了,不建议使用std::auto_ptr。头文件:#include <memory>using namespace std;现有如下测试类:...原创 2017-11-24 15:14:03 · 86887 阅读 · 0 评论 -
C++容器--std::set
一、介绍std::set集合的元素具有顺序性、唯一性等特性,可以指定比较函数进行排序。std::set和std::map一样以红黑树来实现。set成员函数和非成员函数可以参考: http://zh.cppreference.com/w/cpp/container/set二、示例#include <stdio.h>#include <set>#include <memory>class Car原创 2017-12-06 12:41:58 · 88756 阅读 · 0 评论 -
C++ 类型转换
static_cast只提供编译时的类型检查,没有运行时类型检查。完全不相干类型之间的转换是不允许的,编译器会报错。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;虽然也允许进行下行转换(把基类指针或引用转换成子类表示)时,但由于没有动态类型检查,所以是不安全的。用于基本数据类型之间的转换,支持占用不同存储空间的基本类型的转化,但这种转换的安全性也要开发人员来保证。支持vo...原创 2017-12-11 14:10:15 · 88473 阅读 · 0 评论 -
标准库std::min/std::max与min/max宏冲突
如题,因为windef.h中定义了max和min宏:#ifndef NOMINMAX#ifndef max#define max(a,b) (((a) > (b)) ? (a) : (b))#endif#ifndef min#define min(a,b) (((a) < (b)) ? (a) : (b))#endif#endif /* NOMI原创 2017-12-14 12:04:47 · 99233 阅读 · 0 评论 -
Windows内存体系(6) -- 彻底理解内存对齐
一、内存为什么要对齐虽然所有的变量都是保存在特定地址的内存中,但最好还是按照内存对齐的要求来存储。这主要出于两个方面的原因考虑: 平台原因: 不是所有的硬件平台(特别是嵌入式系统中使用的低端处理器)都能访问任意地址上的任意数据,某些硬件平台只能访问对齐的地址,否则会出现硬件异常。 性能原因: 如果数据存放在未对齐的内存空间中,则处理器访问变量时需要进行两次内存访问才能完整读取该...原创 2017-12-24 23:40:51 · 94755 阅读 · 3 评论 -
C++ 匿名对象
在webRTC的源码中有如下函数:template T>std::unique_ptr WrapUnique(T* ptr) { return std::unique_ptr(ptr);}该函数不复杂,但重点在于它直接返回了一个std::unique_ptr。我们知道std::unique_ptr是不能够直接拷贝构造的,如:std::unique_ptr::string原创 2017-12-25 16:01:42 · 95858 阅读 · 0 评论 -
Google C++编程规范
个人认为google的C++编码规范实用性强,相较于微软的编码规范更加简单明了.一、文件命名文件名要全部小写,可以包含下划线(_)或短线(-)。my_useful_class.ccmy-useful-class.ccmyusefulclass.cc二、类型命令类型命名每个单词以大写字母开头,不包含下划线:MyExcitingClass、 MyExciti...原创 2017-12-27 23:07:24 · 82590 阅读 · 2 评论 -
《C++ API设计》摘录
《C++ API设计》是一本非常不错的书,该书内容远远超过了它标题所指的C++ API设计,它不仅仅讲述了与编程语言无关的API设计需要遵循的一些规范,同时也介绍了很多C++开发中需要遵守一些准则,如果在开发中能遵循这些准则,将有利于我们写出高质量的代码。 … 本文将该书中我认为比较受用的部分摘录下来。只有两种编程语言:一种是天天挨骂的,另一种是没人用的。良好的API设...原创 2018-01-27 17:59:34 · 78263 阅读 · 3 评论 -
C++构造函数初始化列表
一. 何为构造函数初始化列表class Sample {public: // 构造函数内部赋值 Sample(int a) { a_ = a; } // 构造函数初始化列表 Sample(int a) : a_(a) { }private: int a_;};上面的代码中,Sample类的2个构造函数的...原创 2018-02-07 19:52:47 · 66834 阅读 · 1 评论