标签:四次挥手 tcp const 约束 names 多资源 zha 多路复用 hub
const int * a // a是一个指针,指向一个const int类型的内存, a本身可以修改指向别的变量,但是a所指向的内存中的数据不能修改。
int const * a // 和第一种相同
int * const a // const修饰的是a, a是一个int *型的变量。也就是说a本身不能修改,即指向确定的内存,但所指向的内存中的数据可以修改。
const int * const a // a以及a所指向的内存中的值都不能被修改。
主要看const
后边修饰的是什么,
const
修饰的是int * a
, 那就是*a
不能被改变, 而a
可以改变。const
修饰的是* a
, 同样*a
不能改变,即指向的内存中的值不能改变。const
修饰的是a
,即a
本身不能被修改,也就是说指向确定的内存空间,而*a
内存中的值可以被改变。#include <iostream>
#include <cstddef>
using namespace std;
struct a{
char a;
int b;
short c;
double d;
};
struct b{
char a;
short b;
int c;
float d;
};
int main()
{
cout<<"sizeof(struct a) : "<<sizeof(struct a)<<" sizeof(struct b) : "<<sizeof(struct b)<<endl;
cout<<"sizeof(short) : "<<sizeof(short)<<endl;
cout<<"sizeof(int) : "<<sizeof(int)<<endl;
cout<<"sizeof(long int) : "<<sizeof(long int)<<endl;
cout<<"sizeof(long long int) : "<<sizeof(long long int)<<endl;
cout<<"sizeof(flaot) : "<<sizeof(float)<<endl;
cout<<"sizeof(double) : "<<sizeof(double)<<endl;
printf("offset of b in struct a : %lun", offsetof(struct a, b));
printf("offset of d in struct a : %lun", offsetof(struct a, d));
printf("offset of b in struct b : %lun", offsetof(struct b, b));
return 0;
}
程序在64位机器上的输出结果为
sizeof(struct a) : 24 sizeof(struct b) : 12
sizeof(short) : 2
sizeof(int) : 4
sizeof(long int) : 8
sizeof(long long int) : 8
sizeof(flaot) : 4
sizeof(double) : 8
offset of b in struct a : 4
offset of d in struct a : 16
offset of b in struct b : 2
结构体的内存对齐有以下
- 结构体变量的起始地址能够被其最宽的成员大小整除
- 结构体每个成员相对于起始地址的偏移能够被其自身大小整除,如果不能则在前一个成员后面补充字节
- 结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节
拿struct a
来说,
char
类型的,占用一个字节,偏移地址为0。int
类型,本身占用4个字节,原本偏移为1,但是1不能被4整除,因此在a
后边需要补充3个字节,这样b
的起始地址偏移就变成了4,能够被自身大小整除,因此b
的起始地址偏移为4。short
类型,本身占用2个字节,偏移为8,能够被本身大小整除。double
类型,本身占用8个字节,偏移为10,不能被本身大小整除,前一个c
后边需要补充6个字节,也就是说double d
的起始地址偏移为16。double d
占8个字节,24能被8整除,所以sizeof (struct a) = 24
。使用定义在 stddef.h 的宏offsetof(type, member) ,可以查看成员相对与结构体类型的偏移值
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int array[2019]={0};
array[19] = 2019;
int offset = (unsigned long)((short *)array+2019) - (unsigned long)array + *(unsigned char *)(array+19);
cout<<offset<<endl;
printf("%pn", 2019);
printf("%pn", array);
cout<<(unsigned long)(array)<<endl;
cout<<(unsigned long)((short *)array+2019)<<endl;
cout<<(unsigned long)array+*(unsigned char *)(array+19)<<endl;
cout<<(int)*(unsigned char *)(array+19)<<endl;
return 0;
}
输出结果如下
4265
0x7e3 // 2019的十六进制,小端存储模式,所以在内存中应为 e3 07, 故*(unsigned char *)(array+19) = 0xe3 = 227
0x7ffeec55a800 // 64位机器输出的地址是64位的
140732863457280 // array的起始地址
140732863461318 // short占用两个字节 (unsigned long)((short *)array+2019)相当于array向后偏移了2*2019=4038个字节,因此地址值为array+4038
140732863457507 //
227
#include <iostream>
#include <string>
using namespace std;
class A{
public:
A(){}
~A(){}
void p(const string & s)
{
cout<<s<<endl;
}
};
int main()
{
A * p = NULL;
p->p("hello worldn");
}
此程序能够正常编译运行输出hello world
。
c++类方法存储在代码段,因此同一个类的所有方法公用代码段,p->p(“hello worldn”);访问的是代码段,所以不会出现段错误或者core dump。
红黑树是每个节点都带有颜色属性的二叉查找树。在二叉查找树强制一般要求外,对于任何有效的红黑树增加额外的要求。
这些约束确保了红黑树的关键特性:从根到叶子的最长可能路径不多于最短的可能路径的两倍长。保证红黑树大致是平衡的。保证红黑树在最坏的请胯下也是高效的。
二叉查找树,也叫二叉搜索树、有序二叉树或者排序二叉树,是一颗空树或者具有以下性质的二叉树:
死锁:多个进程由于互相等待对方持有的资源而造成的谁都无法执行的情况叫死锁。
标签:四次挥手 tcp const 约束 names 多资源 zha 多路复用 hub
原文地址:https://www.cnblogs.com/lijianming180/p/12230904.html