赞
踩
马上要找工作了,发现自己很多看过的书都忘记了,于是开始写博客记录一下,也想以后自己能回忆回忆这段经历吧。
后台开发这本书比较适合找C++后台开发的人读,里面的知识点比较关键,面试基本都会用到。
1 strlen()与sizeof()的区别:
strlen()计算字符串的长度,遇到字符串末尾的’\0’结束。
sizeof()为宏定义的运算符,在编译之前就已经算好。
2 字符串、字符串指针以及字符数组的区别
string str1 = "Hello world !"; //字符串,string类
char str2[] = "I am a programmer." ;//字符数组
char * str3 = "abc";//字符串指针
字符串str1是string类的一个实例,存放在以首地址为首的连续内存块中,并以空字符结束,与str2比较类似。
str2为字符数组,由若干个数组元素组成,每个元素存放字符串的一个字符,也是以空字符结尾。
str3字符串指针变量本身是一个变量,用于存放字符串的首地址。可以改变str1使它指向不同的字符串,但不能改变str1所指的字符串常量。因为定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,所以adc会被当成常量,放到程序的常量区,无法被修改。
3 结构体struct与共同体union在内存单元中的计算
一般64位机器各种内置类型所占存储空间如下:
sizeof(char) = 1;
sizeof(short) = 2;
sizeof(int) = 4;
sizeof(long) = 4;
sizeof(float) = 4;
sizeof(double) = 8;
sizeof(long long) = 8;
很多人都知道计算机数据结构要遵守内存对齐的规则,但至于为什么说得比较模糊。
在一般程序员心中,内存是一个字节一个字节组成的,但是在CPU的眼里,内存是由一个块一个块组成的,现代CPU为64位,最多可同时读8个字节块。
假设现在CPU要读取4个字节的数据(假设内存读取粒度为4):
1.数据从第0个字节开始: 直接读取0-3个字节就结束了。
2.数据从第1个字节开始: 需要读取0-3个字节以及4-7个字节,才能读到1-4字节。这也就是为什么要进行内存对齐的原因。某些平台如果内存不对齐还会抛出硬件异常而导致程序崩塌。
简单的结构体对齐如下:
#include <iostream>
using namespace std;
struct A{
char a;
int b;
short c;
};
struct B{
short c;
char a;
int b;
};
int main()
{
cout<<"sizeof(A) = "<<sizeof(A)<<endl;//4+4+4=12
cout<<"sizeof(B) = "<<sizeof(B)<<endl;//2+1+4=7
}
带数组情况的结构对齐:
情况看似特殊,实则与普通的比较相似。
#include <iostream>
using namespace std;
struct A
{
int a;
int b;
char ch[10];
};
struct B
{
char a;
char b;
int ch[10];
};
int main()
{
cout<<sizeof(A)<<endl; //20
cout<<sizeof(B)<<endl; //44
return 0;
}
结构体中带结构体的内存对齐:
这种情况有点小复杂,内部结构体与外部变量之间的内存区域是分开的。让我们来看下面一段代码:
#include <iostream>
using namespace std;
struct A
{
int a;
double b;
char ch[10];
};
struct B
{
char a;
char b;
int ch[10];
struct A as;
};
int main()
{
cout<<sizeof(A)<<endl; //32
cout<<sizeof(B)<<endl; //80
return 0;
}
4 预处理
带参数的宏定义:
#define func1(x) x*x //会引起误会,例如下面句子
func1(3+2);//显然结果不尽人意
#define func2(x) ((x)*(x))//正确写法,每一个括号都很有必要
do… while的妙用:
当遇到宏定义为复合语句时会用到
#define Foo(x) do{\
statement one;\
statement two;\
}while(0) // 这里没有分号
例如:
if(conditon)
Foo(x);
else
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。