[英]How sizeof operator works for a structure
我正在阅读K&R。 在一个示例中,它将结构数组定义为:
struct key {
char * word;
int count;
} keytab[] = {
"auto", 0,
"break", 0,
/*more members*/
"while", 0
};
然后,要计算数组的大小,它使用两种方法:
1) #define NKEYS (sizeof keytab/ sizeof(struct key))
2) #define NKEYS (sizeof keytab/ sizeof keytab[0])
然后,它说第二种方法的优点是,如果类型更改,则无需更改。 有人可以告诉我最后一行的含义吗? 在这里谈论什么优势?
如果将来您将keytab
数组更改为与struct key
不同的类型,则必须更改第一行sizeof,因为该类型是在此处明确写入的。 第二行sizeof行将保持工作状态,因为它没有命名类型,而是采用数组元素的任何类型。
“ 有人能告诉我最后一行的含义吗? ”
真的很简单。 当您声明某物(任何东西)的数组时,每个元素都是该类型的sizeof
。 (例如, int array[10] = {0};
声明并初始化一个由10个元素组成的int
数组sizeof (int)
。该数组的每个元素都具有sizeof (int)
。
您可以使用array[x]
(其中x为0-9
)访问每个元素。 任何元素,例如array[0]
都是一个int
。 (就像*array
是对第一个元素的引用一样-其中array[0]
只是指针表示法中的*(array + 0)
,当然,它只是*(array)
或*array
,因为括号是然后没有必要)。
返回struct
数组的大小。 sizeof keytab
给出数组中字节的总数。 sizeof keytab[0]
给出每个元素中的字节数。 因此sizeof keytab / sizeof keytab[0]
是数组中元素的数量。 它与编写sizeof keytab / sizeof *keytab
或sizeof keytab / sizeof (struct key)
。
为什么? 因为sizeof keytab[0]
只是sizeof (struct key)
。 但是,如果您根据sizeof (struct key)
确定元素的数量,然后更改类型,则所有具有sizeof (struct key)
代码都会出错,但是如果您使用sizeof keytab[0]
尺寸设置,您的代码将继续具有正确数量的元素,因为您是根据sizeof "an element"
而不是sizeof (an arbitrary type name)
。
对于1),代码需要假定我们正在查看struct key
类型的成员数组。
对于2),代码不需要知道这一点。
出于可维护性的原因,这被认为是2)的优势。
考虑几个在项目上工作的人,一个将数组的定义更改为
struct key2 {
char * word;
int count;
int coolness;
} keytab[] = /* ... */
并将struct key
的定义与其他地方分开,与您的代码相同。 另一个负责带有size宏定义的代码部分。
然后1)变成错误,但2)保持正确。
因此1)将需要两个开发人员之间进行额外的同步,这意味着需要付出额外的努力并有出错的风险。
有人可以告诉我最后一行的含义吗?
使用struct key
类型获取数组元素的实际数量
在这里谈论什么优势?
除了不明确依赖某种类型的优势外,
编译器可以使用实际定义对宏进行更多优化。 与sizeof(type)
相比, sizeof(var)
优化效果更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.