这是否会创建具有冒号后所写的相应大小的变量?
Does this creates variables with respective sizes as written after colon?
我第一次浏览一些涉及大量结构和枚举的代码。所以我在理解上面临一些问题。有一些使用 struct?
的寄存器初始化
struct register_name
{
uint32_t var1:10;
uint32_t var2:22;
};
它会创建 10 位和 22 位的 var1 和 var2 吗? (寄存器为32位)
编译器不会在内部创建两个大小为 10 和 22 的对象。它会在内部创建一个大小为 32 的对象并将其分成两部分,将它们解释为 var1 和 var2。
编译器提供了一种可能性,您可以通过它来控制内部创建的对象数量。
考虑以下演示程序。
#include <stdio.h>
#include <stdint.h>
struct A
{
uint32_t var1:10;
uint32_t var2:22;
};
struct B
{
uint32_t var1:10;
uint32_t : 0;
uint32_t var2:22;
};
int main(void)
{
printf( "sizeof( struct A ) = %zu\n", sizeof( struct A ) );
printf( "sizeof( struct B ) = %zu\n", sizeof( struct B ) );
return 0;
}
它的输出是
sizeof( struct A ) = 4
sizeof( struct B ) = 8
在结构 B 的情况下,每个变量 var1
和 var2
作为一部分包含在其大小等于 32 的内部对象中。
逻辑上var1
和var2
确实对应占用了10位和22位。编译器在幕后完成所有工作。
我第一次浏览一些涉及大量结构和枚举的代码。所以我在理解上面临一些问题。有一些使用 struct?
的寄存器初始化struct register_name
{
uint32_t var1:10;
uint32_t var2:22;
};
它会创建 10 位和 22 位的 var1 和 var2 吗? (寄存器为32位)
编译器不会在内部创建两个大小为 10 和 22 的对象。它会在内部创建一个大小为 32 的对象并将其分成两部分,将它们解释为 var1 和 var2。
编译器提供了一种可能性,您可以通过它来控制内部创建的对象数量。
考虑以下演示程序。
#include <stdio.h>
#include <stdint.h>
struct A
{
uint32_t var1:10;
uint32_t var2:22;
};
struct B
{
uint32_t var1:10;
uint32_t : 0;
uint32_t var2:22;
};
int main(void)
{
printf( "sizeof( struct A ) = %zu\n", sizeof( struct A ) );
printf( "sizeof( struct B ) = %zu\n", sizeof( struct B ) );
return 0;
}
它的输出是
sizeof( struct A ) = 4
sizeof( struct B ) = 8
在结构 B 的情况下,每个变量 var1
和 var2
作为一部分包含在其大小等于 32 的内部对象中。
逻辑上var1
和var2
确实对应占用了10位和22位。编译器在幕后完成所有工作。