使用默认参数在 c++ 中查找 class 模板的大小

finding the size of a template in c++ for a class with default arguments

我对此的疑问是为什么计算 b 的大小时输出为 8 个字节(我机器上 int 的大小为 4 个字节)。不应该是 4(对于 int)+ 1(对于 char;设置为默认值)吗?此外,当我在模板声明中指定多个默认参数时,确定大小的标准是什么?

#include<iostream>
using namespace std;
template<class T, class U = char> class A
{
public:
    T x;
    U y;
};
int main()
{
    A<char> a;
    A<int> b;
    cout<<sizeof(a)<<endl;
    cout<<sizeof(b)<<endl;
    return 0;
}

输出为:

 2
 8

由于硬件限制,大小为 N > 1 的对象可能必须放置在某个地址步长 A 的倍数的内存地址中,该步长大小取决于 N,但通常为 2、4、8 或16. 这叫做对齐。由于一个值​​总是可以从它的各个字节重构,可以在任何地址访问,这只是效率问题,但如果支持错误对齐,效率损失可能是巨大的。

为了支持对齐,编译器填充结构,以便在这样的结构序列中,例如在数组中,只要第一个是,每个结构都可以接受对齐。

在你的例子中,具有两个 char 值(字节)的结构没有被填充,因为这些值可以在任何地址有效地访问。但是带有 int 的结构被填充,以确保 int 总是以可接受的对齐方式结束。特别是在这样的结构数组中。


再问最后一个问题

Moreover what is the criteria for determining size when I am specifying multiple default arguments in template declaration?

… 模板参数的默认设置与 wrt 完全无关。尺寸。

原因是内存对齐。

对于A a,a有两个char类型的成员,所以大小为1 + 1 = 2,但是对于A b,b有两个成员,一个是char类型,另一个是int类型,大小不是简单的1+4=5,因为内存对齐,大小是(1+3)+4,3是为了对齐。下图为对齐方式

内存对齐可以提高内存访问performance.In C++,对齐长度通常是class或结构中元素的最长长度。在您的示例中,对齐长度为 sizeof(int) = 4,但在下一个示例中:

class E
{
     double x;
     int    Y;
     char   Z;
};

因为最长的长度是 sizeof(double) = 8,所以 sizeof(E) 就是 8 + (4 + 1 + 3) = 16

这是数据对齐和填充的概念。详情:http://www.geeksforgeeks.org/structure-member-alignment-padding-and-data-packing/