使用默认参数在 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/
我对此的疑问是为什么计算 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/