1. sizeof问题?
class structer {
public:
virtual function();
char s1;
char s2;
double f;
};
那么sizeof(structer)结果是?
这个问题需要注意两个答题点。
1. 结构体的地址自动对齐,因为double f 占用8个字节,因此存储变量时不足8个字节的就需要按照8字节对齐;s1和s2, 顺序存储 只占用2个字节,不足8个字节,因此需要占用8个字节;f占用8个字节;
2. virtual function,占用一个虚指针(指向虚表),64位机器的指针长度为8字节,
因此,sizeof(structer) == 24 字节;
例程和输出结果
class Structer {
public:
virtual int function() {
cout << "this is a function" << endl;
return 0;
}
char s1;
char s2;
char s3;
double f;
};
int main() {
std::cout << "Hello World!\n";
std::cout << sizeof(Structer) << endl;
}
Hello World!
24
2. c++中有哪些常用的容器?
这个问题其实并不复杂, 大致有以下几类:
vector, stack, queue, deque, list, map, set, unordered_map 等
3. 虚函数的实现原理?
动态多态的实现依赖于虚函数,编译时函数代码会被替换为虚指针,虚指针指向虚表,每个类都有一个虚表,存储对应的函数代码段;
4. 变量存储在堆比较快,还是栈比较快?
变量存储在栈上比较快,因为堆的内存申请需要 malloc等操作,而栈是编译器分配的。
堆访问数据需要两次操作,第一次取得数据的地址,第二次根据地址拿到数据。
如果数据分配在栈上,那么一次就可以得到数据,这是因为栈上的变量被保存在了寄存器上;
另外在堆上的内存空间,如果开辟空间比较大,很可能被从内存置换到了硬盘上;