zoukankan      html  css  js  c++  java
  • C++面试总结

    本次文章主要记录2017年8月9日的一次面试,面试官问的相对比较简单,但是发挥的不是很好,基础的知识都有遗忘,因此将笔试以及面试知识点总结在此。

    1、基本数据类型所占的字节大小

          基本关系:short <= int <= long

    c/c++数据类型所占字节数比较
    数据类型 32位操作系统 64位操作系统
    char 1个字节 1个字节
    *(指针) 4 8(改变)
    short int 2 2
    int 4 4
    unsigned int 4 4
    float 4 4
    doule 8 8
    long 4 8(改变)
    unsigned long 4 8(改变)
    long long 8 8

    2、字节对齐问题(怎么做的、有什么作用)

      (1)为什么要进行字节对齐:在计算机体系中,CPU对内存的读取时按照CPU的位数来操作的,32位按照4字节进行存取(64位按照8字节)数据,考虑到计算机的指令周期,为了计算机能够在一次指令周期完成对数据的存取,需要对内存中的数据进行字节对齐,以提高计算机的存取效率。如果未进行字节对齐,有的数据会存储在奇数的位置,那么计算机再一次指令周期内无法完成对数据的存取,需要两个指令周期分别获得数据的高低字节来进行数据重组,这样计算机的性能会降低。

      (2)字节对齐是怎么做的:每个数据都有自己的对齐字节,数据必须在符合对齐自己的的位置进行存储。在定义不同类型数据时,程序员可以不用特别关注字节对齐的问题,编译器会根据CPU的自己类型来自动进行数据字节对齐存储,如果要制定字节对齐的方式,可以使用预编译指令#pragma pack(val)告诉编译器,以参数val制定的对齐值来取代默认的字节对齐值。

      (3)有什么作用:可以提高CPU的存取效率。

      举例分析:(一般字节对齐对结构体类型大小影响比较明显)

    1 struct A{
    2     int a;      //4
    3     char b;    //1
    4     short c;   //2
    5 };    

      在此结构体中,a占4个字节,b占1个字节,c占2个字节,总共为7个字节,但是为了自己对齐,编译器会在存储完c后,自动填充一个字节再进行下次数据的存储,因此结构体A的大小为8个字节。

    struct B{
        char a;   //1
        int b;     //4
        short c;  //2         
    };

      结构体B中,存储完a会自动填充3个字节然后存储b,存完c后,为了字节对齐,又填充2个字节,因此大小为12字节。可见,结构体的大小与数据存储的顺序有关系。

    3、SQL数据库查询

    4、避免死锁所需最少资源数计算

    5、二叉树查找问题

    6、归并排序算法

    7、部分字符串移位

    8、斐波那契数列打印(此代码运行超时,需要算法后优化)

     1 #include <stdio.h>
     2 
     3 int getNthNumber(int n);
     4 
     5 int main()
     6 {
     7     int n = 0;
     8     int num = 0;
     9     scanf("%d",&n);
    10     num = getNthNumber(n);
    11     printf("结果:%d
    ",num);
    12 }
    13  int getNthNumber(int n) {
    14         // write code here
    15         //int i = 0;
    16       
    17         int num1;
    18         int num2;
    19         int num3;
    20         num1 = num2 = 1;
    21         if (n > 0 && n <= 2)
    22             {
    23             return 1;
    24         }
    25         
    26         for (int i = 2; i <= n; i++)
    27             {
    28             num3 = num1 + num2;
    29             num1 = num2;
    30             num2 = num3;
    31 
    32             //printf("%d
    ",num3);
    33         }
    34         
    35         return num3;
    36     }

    9、使用迭代器删除vector元素具体怎么操作

    10、windows多线程编程

    11、字符串拷贝怎么限定目的地址大小

    12、友元实现了什么

    13、类的三种继承问题

    14、多态实现机制

    15、虚继承通过指针访问子类和父类成员函数问题

      

  • 相关阅读:
    SQL常用语句(不定期更新)包含 日期格式,取列
    前端开发 ---浏览器自动刷新
    记录Redis使用中遇到的两个问题(原子性及数据完整性)
    Linux 输出重定向
    逆向手机内核,添加调试支持及绕过反调试
    阿里2014移动安全挑战赛第二题调试笔记
    在redhat6.4上编译z3求解器
    WCF学习笔记一(概述)
    DataReader反射泛型对象
    自定义配置节点(一)
  • 原文地址:https://www.cnblogs.com/kks170716/p/7353696.html
Copyright © 2011-2022 走看看