C++养蛊之路

C++养蛊之路

1. sizeof方法

若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. C++模板类方法分离定义时出现Undefine Reference to…

​ 一般来说,编写C++程序时,推荐将类或者函数的声明与实现分离,也就是说一个类的声明放在example.h文件中,而这个类的实现放在example.cpp文件中,这样方便管理,条理清晰

​ 但是如果当类的声明中使用了模板template时,类的声明和分离是不可取的,此时GCC编译器会报错,如下

undefined reference to `void Test<int>::test<double>`
error: ld returned 1 exit status

所以当程序中用到了模板template时,需要把函数的实现放在类的声明文件中,至于函数是直接在class声明内定义,还是在class声明外定义都可以。

此外,还需注意:

类模板的成员函数是一个普通函数。但是类模板的每个实例都有其自己版本的成员函数。因此类模板的成员函数具有和模板相同的模板参数。因此定义在类模板之外的成员函数就必须以关键字template开始,后接类模板参数列表。

解决模板类的声明和分离问题,一般有以下两种方法:

  • 将类的声明和类方法的定义放在同一个.h或者.cpp文件中;

  • 将类方法定义的文件名后缀更改为.tpp,然后再头文件中加入一行代码引用我们的tpp文件;

    #include "test.tpp"
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2024 lk
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信