【技术总结】C++ 面试问题总结-11/8

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等操作,而栈是编译器分配的。

堆访问数据需要两次操作,第一次取得数据的地址,第二次根据地址拿到数据。

如果数据分配在栈上,那么一次就可以得到数据,这是因为栈上的变量被保存在了寄存器上;

另外在堆上的内存空间,如果开辟空间比较大,很可能被从内存置换到了硬盘上;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值