面试题答案
一键面试1. 数据对齐
- 原理:现代计算机系统对内存访问有特定要求,数据对齐可以让数据存储在合适的内存地址上,提高内存访问效率。例如,对于32位系统,一个4字节的
int
类型变量最好存储在4字节对齐的地址上(即地址能被4整除)。如果数据未对齐,CPU可能需要进行多次内存访问来获取完整数据,降低效率。 - 实现方式:在C++中,可以使用
#pragma pack
指令或者alignas
关键字来控制数据对齐。例如:
// 使用 #pragma pack 设置对齐方式为4字节
#pragma pack(4)
class MyClass {
char a; // 1字节
int b; // 4字节,按4字节对齐,a后面填充3字节
short c; // 2字节,b后面填充2字节,凑够4字节对齐
};
#pragma pack() // 恢复默认对齐方式
// 使用 alignas 关键字
class AnotherClass {
alignas(8) long long d; // 8字节,按8字节对齐
double e; // 8字节,按8字节对齐
};
2. 内联函数
- 原理:内联函数是一种特殊的函数,编译器会在调用处将函数代码展开,避免了函数调用的开销(如压栈、跳转等),从而提高效率。对于频繁调用且代码简短的成员函数,使用内联可以显著提升性能。
- 实现方式:在C++中,可以在函数定义前加上
inline
关键字声明内联函数,或者将函数定义直接写在类定义内部(隐式内联)。例如:
class DataClass {
int data;
public:
// 隐式内联函数
int getValue() const { return data; }
// 显式内联函数声明
inline void setValue(int val) { data = val; }
};
3. 成员函数的const修饰
- 原理:
const
修饰的成员函数承诺不会修改对象的成员变量(除了声明为mutable
的变量)。这有助于编译器进行优化,同时也使代码的意图更清晰,调用者可以明确知道该函数不会改变对象状态。并且在一些情况下,const
对象只能调用const
成员函数,这有助于代码的正确性和安全性。 - 实现方式:在成员函数参数列表后加上
const
关键字。例如:
class MyData {
int member;
public:
int readData() const { return member; } // const成员函数
void writeData(int newVal) { member = newVal; } // 非const成员函数
};
4. 综合示例
// 使用 alignas 进行数据对齐
class BigDataClass {
alignas(8) long long largeData1;
alignas(8) double largeData2;
int smallData;
public:
// 隐式内联函数
long long getLargeData1() const { return largeData1; }
// 显式内联函数
inline double getLargeData2() const { return largeData2; }
int getSmallData() const { return smallData; }
// const修饰,表明不修改对象状态
void printData() const {
std::cout << "Large Data 1: " << largeData1
<< ", Large Data 2: " << largeData2
<< ", Small Data: " << smallData << std::endl;
}
};
在上述BigDataClass
中,通过alignas
进行数据对齐,成员访问函数采用内联,printData
函数使用const
修饰,从而提高成员函数区分并访问不同对象数据的效率。