内存分配有三种:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。栈区:在执行函数时,函数(包括main函数)内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效
标准c++中string类函数介绍 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型。 好
多线程能提高程序的效率,但同时也带来了相应的问题----数据竞争。当多个线程同时操作同一个变量时,就会出现数据竞争。出现数据竞争,一般会用临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)这四种方法来完成线程同步。 1、临界区 对于临界资源,多线程必须互斥地对它进行访问。每个线程访问临界资源的那段代码就称为临界区。它保证每次只能有一
chrono是一个time library, 源于boost,现在已经是C++标准, 今天我们一起来看看它的用法。 要使用chrono库,需要#include<chrono>,其所有实现均在std::chrono namespace下。注意标准库里面的每个命名空间代表了一个独立的概念。所以下文中的概念均以命名空间的名字表示! chrono是一个模版库,使用简单,功能强大,只需要理
标准STL序列容器:vector、string、deque和list。标准STL关联容器:set、multiset、map和multimap。非标准序列容器slist和rope。slist是一个单向链表,rope本质上是一个重型字符串。非标准关联容器hash_set、hash_multiset、hash_map和hash_multim今天我们的主题是:
指针和数组是C的比较难搞懂的知识点, 需要结合内存来学习, 非常感谢各位兄弟为我指点迷津.下面总结一下 : 首先说明一下C程序在运行时, 不同的内容或变量分别存储在什么地方?分了几块区域分别是, code, constants, global, heap, stack; (内存地址从低到高)其中constants存储常量(常量值不允许修改), global存储在所有
c++11 中创建线程非常简单:[cpp] view plain copy#include #include using namespace std; void thread_func() { //... } void thread_func2(int i) {
在多线程编程中,有时某个任务只需要执行一次,此时可以用C++11中的std::call_once函数配合std::once_flag来实现。如果多个线程需要同时调用某个函数,std::call_once可以保证多个线程对该函数只调用一次。也可用在解决线程安全的单例模式。C++11中的std::call_once函数位于<mutex>头文件中。template<class Call
共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。union变量所占用的内存长度等于最长的成员的内存长度。另外,同struct一样,联合默认访问权限也是公有的,并且,也具有成员函数。联合里面的东西共享内存,所以静态、引用都不能用,因为他们不可能共享内存。此外联合
内存是以字节为单位进行编址的,编程语言的基本类型中,最小类型的长度一般也就是1个字节。然而,在解决某些问题时,必须要有二进制层面的表达手段(如CAN数据的解析等),又或者某些情形下根本用不着1个字节,作为强大到令人窒息的C/C++,难道没有解决方法?其提供的完美解决方法就是位域(位段)结构,本文将从定义、说明、内存布局和使用这四个方面对它进行详细的介绍。1. 位域定义首先,让我们看一下位域的定义。
从4行代码看右值引用概述 右值引用的概念有些读者可能会感到陌生,其实他和C++98/03中的左值引用有些类似,例如,c++98/03中的左值引用是这样的:int i = 0;int& j = i; 这里的int&是对左值进行绑定(但是int&却不能绑定右值),相应的,对右值进行绑定的引用就是右值引用,他的语法是这样的A&&,通过双引号...
1概述C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。然而由于可变模版参数比较抽象,使用起来需要一定的技巧,所以它也是C++11中最难理解和掌握的特性之一。虽然掌握可变模版参数
在C++开发过程中,我们经常会用STL的各种容器,比如vector,map,set等,这些容器极大的方便了我们的开发。在使用这些容器的过程中,我们会大量用到的操作就是插入操作,比如vector的push_back,map的insert,set的insert。这些插入操作会涉及到两次构造,首先是对象的初始化构造,接着在插入的时候会复制一次,会触发拷贝构造。但是很多时候我们并不需要两次构造带来效率的浪
在我们平时的开发工程中,会经常使用到宏,它功能强大,用的好会带来意想不到的妙用。今天来整理下一些常见的用法,方便回顾。***************************************************************************************************************************#:将其后面的宏参数进行字符...
做嵌入式开发经常遇到一些编译器和C++版本不匹配的问题,现整理如下:目前C语言的标准有:C89(ANSI C)、C90、C95、C99(ISO C)、C11(C1x)目前C++语言的标准有:C++98、C++03(对98小幅修改)、C++11(全面进化)、C++14、C++17C语言标准的介绍,请参考:C语言标准简介C89(ANSI C)、C99(ISO C)、C11(C1x)各...
一、memmove()和memcpy()函数和strcpy()函数的区别;(1)使用的类型不同,strcpy()函数只对字符串进行操作;memmove()和memcpy()函数对所有类型都适用,为内存拷贝;(2)strcpy()以’\0’为拷贝的结束条件;而memmove()和memcpy()函数则是以第三个参数num进行控制拷贝;二、函数说明:1.memcpy函数的功能是从源sr...
#pragma pack(push,1)与#pragma pack(1)的区别这是给编译器用的参数设置(注意,在编译阶段),有关结构体字节对齐方式设置,#pragma pack是指定数据在内存中的对齐方式。#pragma pack (n) //作用:C编译器将按照n个字节对齐。#pragma pack ()//作用:取消自定义字节...
1、sizeof sizeof是运算符,其值在编译时已计算好,参数可以是数组、指针、类型、对象、函数等。 功能是获得保证能容纳实现所建立的最大对象的字节大小。由于在编译时计算,故不能用来返回动态分配的内存空间大小。2、strlen strlen是函数,运行时计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。 功能是返回字符串的长度。该字符串可能是自己定义的
一、sizeof是什么 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法 1、用于数据类型 sizeof使用形式:sizeof(type)
之前一直以为C++引入正则表达式之前,不能实现类似功能,最近发现sscanf就可以实现一些简单的字符串解析功能,记录下。int scanf( const char *format [,argument]… ); char buf[100]; //1、常用用法 sscanf("123456abcdeABCDE", "%s", buf); printf("1 、buf = %s\n", buf
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号