- 若char是一字节,int是4字节,指针类型是4字节,代码如下:
class CTest {
public:
CTest():m_chData(‘\0’),m_nData(0) {
}
virtual void mem_fun(){}
private:
char m_chData;
int m_nData;
static char s_chData;
};
char CTest::s_chData=’\0’;
问:
(1)若按4字节对齐 sizeof(CTest) 的值是多少?
(2)若按1字节对齐 sizeof(CTest) 的值是多少?
答案 :
若按4字节对齐 sizeof(CTest) 的值是12;
若按1字节对齐 sizeof(CTest) 的值是9解释:
在类中,如果什么都没有,则类占用1个字节,一旦类中有其他的占用空间成员,则这1个字节就不在计算之内,如一个类只有一个int则占用4字节而不是5字节。如果只有成员函数,则还是只占用1个字节,因为类函数不占用空间虚函数因为存在一个虚函数表,需要4个字节,数据成员对象如果为指针则为4字节,注意有字节对齐,如果为13字节,则进位到16字节空间。
sizeof的本质是得到某个类型的大小,确切的来说就是当创建这个类型的一个对象(或变量)的时候,需要为它分配的空间的大小。而类也可以理解为类似于int、float这样的一种类型,当类中出现static成员变量的时候,static成员变量是存储在静态区当中的,它是一个共享的量,因此,在为这个类创建一个实例对象的时候,是无需再为static成员变量分配空间的,所以,这个类的实例对象所需要分配的空间是要排除static成员变量的,于是,当sizeof计算类的大小的时候会忽略static成员变量的大小。
2. 运行时的输出结果是()
#include<iostream>
using namespace std;
class MyClass {
public:
MyClass(int i = 0) {
cout << i;
}
MyClass(const MyClass &x) {
cout << 2;
}
MyClass &operator=(const MyClass &x) {
cout << 3;
return *this;
}
~MyClass() {
cout << 4;
}
};
int main() {
MyClass obj1(1), obj2(2);
MyClass obj3 = obj1;
return 0;
}
答案: 122444
解析:实例化对象时候,
=
代表浅拷贝。后续对象赋值时候,=
代表深拷贝
3. 下面代码会输出什么()
int main(int argc, char **argv)
{
int a[4] = {1, 2, 3, 4};
int *ptr = (int *)(&a + 1);
printf("%d", *(ptr - 1));
int **pptr = &a;
printf("%d", *++pptr)
}
答案:4,
解析:&a 是一个指向 int[8] 类型的指针 int (*ptr)[4] = &a,因此
&a + 1 = a + 4 = &a[5]
- const int * / int const * / int * const
- 虚函数实现
- C++ 内存管理
- tcp udp 区别及各自适用场景举例
- 野指针问题
- 字节对齐
- strcpy 安全性
- epoll select
- select 默认描述符最大的个数
- ipc
- 多线程、多进程 同步互斥问题
- 快排算法实现
- 建立 tcp 连接,client server 分别调用哪些函数