emplace_back()
emplace_back( )在容器末尾添加一个新元素,它通常使用 placement-new 在容器提供的位置就地构造元素。
通常要保证操作后的size不大于旧的capacity(end迭代器要重新生成),否则需要重新分配内存,这种情况下所有迭代器和对元素的所有引用都会失效。
下面代码是从cpp reference抄来的,理解一下怎么运行的。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546#include <vector>#include <cassert>#include <iostream>#include <string> struct President{ std::string name; std::string country; int year; President(std::string p_name, std::string p_country, int p_yea ...
栈和寄存器
0x01 寄存器和栈
被调用者保护%rbp ,%rbx和%r12~15
被调用者保护的寄存器在进入一个函数后会先压入栈来保存原先的值
返回值%rax
寄存器rax通常存储着一个函数的返回值
调用者保护除被调用者保护外。
和被调用者保护相反,可以随意修改该寄存器里的值而不需要压入栈来保存
参数%rdi,%rsi,%rdx,%rcx,%r8,%r9
这里默认有六个参数寄存器,在传入函数时使用,超过的参数将在栈帧上保存
栈指针%rsp
指示着栈顶的位置,栈往低处生长
0x02 运行时栈
返回地址在进入一个函数前,先将该call该函数的指令的下一条指令的地址压入栈,当执行ret指令时将该返回地址从栈中弹出,作为%rip的值(下一条执行指令的地址)
被保存的寄存器对应寄存器中的被调用者保护寄存器,进入函数前先保存。
局部变量有时,局部数据必须存放在内存中,常见的情况包括:
1、寄存器不足够存放所有的本地数据。
2、对一个局部变量使用地址运算符'&',因此必须能够为它产生一个地址
3、某些局部变量是数组或结构,因此必须能够通过数组或结构引用被访问到
参数构造区当传入的函数的参数超过六个(对应六个 ...
联合和数据对齐
0x01 联合联合允许以多种类型来引用一个对象
123456union U3{ char c; int i[2]; double v;}//三种数据结构仅能存储一种
一个联合的总的大小等于它最大字段的大小
应用场景:
一个数据结构中的个不同字段的使用是互斥的,那么将这两个字段声明为联合的一部分 ,而不是结构的一部分,会减小分配空间的总量。
union还可以用来访问不同的数据类型的位模式,用一种数据类型才存储联合中的参数,又用另一种数据类型来访问它,除了有一样的位模式外,数值一般没有任何关联。
0x02 数据对齐许多计算机系统对基本数据类型的合法地址做出了 些限制,要求某种类型对象的地址必须是某个值 K( 通常是2,4或8) 的倍数。这种对齐限制简化了形成处理器和内存系统之间接口的硬件设计。
对齐原则对齐原则是任何K字节的基本对象的地址必须是K的倍数。
align 8
这段声明保证了它后面的数据的起始地址是8的倍数,常用于8字节数据类型的对齐。
结构体看下面的例子:
结构体的起始地址和其中的数据类型,一般要满足对齐(对齐大小一般最大的数据类型大小) ...
结构体数据类型所占字节长度
记录一下结构体的数据类型大小怎么算,主要看对齐数和地址偏移量
计算原理举个例子
12345678910111213#include<iostream>typedef struct student { int num; char name[10];//8 byte int com, math, english; double average;//8 byte} stu;stu boy[1000], * p;int main() { std::cout << sizeof(stu)<<"\n"; std::cout << sizeof(int); return 0;}
对齐数的大小,在vs编译器里,是数据类型大小和默认对齐数(vs是8)的最小值。
从第二个数据开始,数据首个字节的地址的偏移量要为对齐数的整数倍
对于数据类型stu,num先填充4 bytes,之后第二个char name[10]的对齐数是10和8的较小值,为8 bytes,首地址应为8的整数倍的偏移地址量,最小为8,所 ...
数学公式编辑
0x01 前言打算记录一些数学题目,发现不会编辑数学公式,遂记录。
编辑数学公式前,要将其囊括在首尾两个美元符号的大括号中。
0x02 常用符号整合一些常用的符号例如古希腊字母,积分符号,求和符号等等。
古希腊字母
各种运算符号
三角函数和对数只需要在反斜杠后加上对应字母表示
补充一下圆周率是pi
向量符号和根号等
调整大小主要是math mode
0x03 基本编辑方法记录一些数学公式编辑方法
如何输入上下标^ 表示上表,_ 表示下标,如果上下标的内容多于一个字符,需要用 {}将这些内容括成一个整体
1${e{^x_y}=(x+2)^5}$
${e{^x_y}=(x+2)^5}$
如何显示分数通常使用 \frac {分子} {分母} 来生成一个分数,分数可多层嵌套。如果分式较为复杂,亦可使用 分子 \over 分母 此时分数仅有一层 ...
C++11关于四个引用的学习
0x01 引用的嵌套It is permitted to form references to references through type manipulations in templates or typedefs, in which case the reference collapsing rules apply: rvalue reference to rvalue reference collapses to rvalue reference, all other combinations form lvalue reference
引用折叠规则:右值对右值的引用折叠为右值引用,所有其他组合为左值引用。
0x02 左值引用Lvalue references can be used to alias an existing object (optionally with different cv-qualification):
左值引用可以作为一个已存在对象的别名,且可以用多个别名,别名之间共享一个对象。
1234567891011int main(){ s ...