dji-2022-08-14-C++开发B卷 70左右
一、5*4' 单选
结构体中最后的数据成员是一个指针,指针地址和结构体的地址是不是连续的?不一定
指针访问是不是一种间接的访问?是
对错
char a[3]={'e',0,'t'};
char b[]={'a','b',128};
long c[]={1,0,1.0f};
char a[3]="123";new 申请的内存不能用free() 释放
都能运行,不会报错。。选对的 C?
a。右值引用任何时候都是右值
b。右值引用任何时候都是左值
c。匿名右值引用是右值
d。具名右值引用是右值
二、5*4' 多选
虚函数不可以为静态函数
虚函数表指针的地址在对象内存布局的最前面(单继承)多选题选对的。。
选择排序不稳定
快排空间复杂度是O(1)
20,3,40,6,25,16,29,以第一个为pivot,快排一轮后是3,6,16,20,40,25,29C是C++的子集
引用本质是指针
char* 和 char[] 本质是同一种类型正确的是 (ad)
a。dynamic_cast 可以把派生类指针指向其可访问基类的指针
b。const_cast 可以把 const int* 转换为 char*
c。reinterpret_cast 可以把 const char* 转换为 char*
d。static 不能去掉 const 修饰智能指针用模板类实现,对
会把数据存放在自己类内存存储空间中,❌
三、3*6' 填空
- 32位系统,4B对齐,
sizeof(a)=12B
struct a{char b; char* c; short d;};
64位 8B 对齐是24字节
- 已知 capacity 翻倍增长,
a=6
先写的6,后改错成了16,以为初始化成16,然后按16n-1
变化
vector<int> v(3); v.push_back(1); v.reserve(5); v.pop_back(); int a=v.capacity();
sizeof(a)=又改错了自己试吧
64位系统
class a{ public: a(){char* ch=new char[10];} ~a(){delete[] ch;} private: char* ch; };
四、8*3' 简答
解释什么是栈内存、什么是堆内存,以及二者区别
下面代码自测通过,请问有无问题,解释自测通过的原因,对于减少这种代码合入仓库有没有什么建议 (8')
#include<functional> #include<thread> class c{ public: c(function<void()>f):fc(move(f)),t([this](){fc();}){} ~c(){ // 两个if // 两个函数:joinable()、join() } private: thread t; function<void()> fc; };
- 多线程加锁的基本原则。
- 避免出现死锁
- 尽量用条件变量或信号量机制,避免忙等待,自旋
- 加锁是有一定开销的,避免对很频繁又执行时间很短的任务多次加锁
- 只对临界区加锁
- 记得及时地释放锁
- 并行访问共享资源时,一定要加锁保护
- 指责单一
- 锁范围尽量小,只锁对应资源操作代码
- 避免嵌套加锁;如果必须加锁,务必保证不同地方的加锁顺序是一样的
- 可重入函数尽量只使用局部变量和函数参数,少用全局变量、静态变量
- 锁中避免调用函数;如果必须调用函数,务必保证不会造成死锁
- 锁中避免使用跳转语句
五、编程 18'
base64编码
输入一个hex编码(16进制字符串)表示的含大小写字符的字节序列,字符串长度为偶数且不超过100,输出其 base64 编码。
每6个bit为一个64进制字符,3个字节由4个可打印字符表示。
0~25对应A~Z,26~51对应a~z,52~61对应0~9,62对应+,63对应/
当输入的二进制序列字节数不为3的倍数时,需要用0字节将长度补充到3的倍数,为与实际的“0”字节进行区别,补充的“0”会被编码为“=”。
我加:补充的0是在字符串末尾,如果输入字符串还剩下小于6位没打印,和补充的0组合在一起翻译,而不是作为等于号。
输入:00
输出:AA==
解释:补充两个0字节,得到24个二进制0。
#include<iostream> #include<vector> using namespace std; inline char i64c(int i){ if(i<26) return 'A'+i; if(i<52) return 'a'+(i-26); if(i<62) return '0'+(i-52); if(i==62) return '+'; return '/'; } inline int r(char i){ if(isdigit(i)) return i-'0'; i=tolower(i); return 10+(i-'a'); } // 86%。歪打正着 int main(){ string s,ans; cin>>s; // if(s.length()==0){ // cout<<"===="; // return 0; // } vector<int> a; for(auto c:s){ int g = r(c); if(g&8)a.push_back(1); else a.push_back(0); if(g&4)a.push_back(1); else a.push_back(0); if(g&2)a.push_back(1); else a.push_back(0); if(g&1)a.push_back(1); else a.push_back(0); } int i=0; while(a.size()%6!=0){ a.push_back(0); } while(i+6<=a.size()){ int k=i, to=k+6,sum=0; while(k<to){ sum=sum*2+a[k]; k++; } ans+=string(1,i64c(sum)); i+=6; } while(a.size()%24!=0){ for(int q=0;q<6;q++) a.push_back(0); ans+="="; } // while(i<a.size()){ // ans+="="; // i+=6; // } cout<<ans; return 0; } // 43% 更符合题意 // int main(){ // string s,ans; // cin>>s; // vector<int> a; // for(auto c:s){ // int g = r(c); // if(g&8)a.push_back(1); // else a.push_back(0); // if(g&4)a.push_back(1); // else a.push_back(0); // if(g&2)a.push_back(1); // else a.push_back(0); // if(g&1)a.push_back(1); // else a.push_back(0); // } // int i=0, b=0; // while(a.size()%6!=0){ // a.push_back(0); // b++; // } // while(i+6<=a.size()){ // int k=i, to=k+6,sum=0; // while(k<to){ // sum=sum*2+a[k]; // k++; // } // ans+=string(1,i64c(sum)); // i+=6; // } // while(b<8){ // a.push_back(0); // b++; // } // while(a.size()%24!=0){ // for(int q=0;q<8;q++) // a.push_back(0); // } // while(i<a.size()){ // ans+="="; // i+=6; // } // cout<<ans; // return 0; // }#大疆校招##大疆笔试##2023校招##笔试##C++#