Structures, unions, enumerations, and bitfields in ARM C and C++
Structures, unions, enumerations, and bitfields in ARM C and C++
Non-Confidential | ARM DUI0375E | |||
|
||||
Home > C and C++ Implementation Details > Structures, unions, enumerations, and bitfields in ARM C and C++ |
10.4 Structures, unions, enumerations, and bitfields in ARM C and C++
Describes the implementation of the structured data types union
, enum
, and struct
. It also discusses structure padding and bitfield implementation.
Unions
union
is accessed using a member of a different type, the resulting value can be predicted from the representation of the original type. No error is given.Enumerations
enum
is implemented in the smallest integral type that contains the range of the enum
.--enum_is_int
, if an enum
contains only positive enumerator values, the storage type of the enum
is the first unsigned type from the following list, according to the range of the enumerators in the enum
. In other modes, and in cases where an enum
contains any negative enumerator values, the storage type of the enum
is the first of the following, according to the range of the enumerators in the enum
:unsigned char
if not using--enum_is_int
signed char
if not using--enum_is_int
unsigned short
if not using--enum_is_int
signed short
if not using--enum_is_int
signed int
unsigned int
except C with--strict
signed long long
except C with--strict
unsigned long long
except C with--strict
.
Note
In ARM Compiler 4.1 and later, the storage type of the enum
being the first unsigned type from the list applies irrespective of mode.
enum
in this way can reduce data size. The command-line option --enum_is_int
forces the underlying type of enum
to at least as wide as int
.Note
--enum_is_int
option, and that share interfaces or data structures.int
s. That is, they must be in the range -2147483648 to +2147483647, inclusive. A warning is issued for out-of-range enumerator values:#66: enumeration value is out of "int" range
unsigned int
, long long
, or unsigned long long
.armcc --diag_error=66 ...
Structures
- all C structures
- all C++ structures and classes not using virtual functions or base classes.
sizeof()
function returns the size of the structure including padding.according to how the structure is defined:
- Structures that are defined as
static
orextern
are padded with zeros. - Structures on the stack or heap, such as those defined with
malloc()
orauto
, are
padded with whatever is previously stored in those memory locations. You cannot
usememcmp()
to compare padded structures defined in this
way.
--remarks
option to view the messages that aregenerated when the compiler inserts padding in a
struct
.struct
{
int x;
} X = { };
--cpp
and--c90
options, an error is generated.Packed structures
__packed
qualifier. Alternatively, you can use #pragma pack(n
)
to make sure that any structures with unaligned data are packed. There is no command-line option to change the default packing of structures.Bitfields
- Little-endian
-
Lowest addressed means least significant.
- Big-endian
-
Lowest addressed means most significant.
Note
int
, signed int
, and unsigned int
. For non-int
bitfields, the compiler displays an error.signed
or unsigned
qualifiers, is treated as unsigned
. For example, int x:10
allocates an unsigned integer of 10 bits.struct X
{
int x:10;
int y:20;
};
x
. At the second declaration, the compiler finds the existing integer container with a sufficient number of unallocated bits, and allocates y
in the same container as x
.z
overflows the container if an additional bitfield is declared for the structure:struct X
{
int x:10;
int y:20;
int z:5;
};
z
.struct X
{
int x:10;
char y:2;
};
x
. These 10 bits occupy the first byte and two bits of the second byte of the integer container. At the second declaration, the compiler checks for a container of type char
. There is no suitable container, so the compiler allocates a new correctly aligned char
container.char
is 1, the compiler searches for the first byte that contains a sufficient number of unallocated bits to completely contain the bitfield. In the example structure, the second byte of the int
container has two bits allocated to x
, and six bits unallocated. The compiler allocates a char
container starting at the second byte of the previous int
container, skips the first two bits that are allocated to x
, and allocates two bits to y
.y
is declared char y:8
, the compiler pads the second byte and allocates a new char
container to the third byte, because the bitfield cannot overflow its container. The following figure shows the bitfield allocation for the following example structure:struct X
{
int x:10;
char y:8;
};
Note
container types. For example, adding an
int
bitfield to the example structure gives:struct X
{
int x:10;
char y:8;
int z:5;
}
int
container starting at the same location as the int x:10
container and allocates a byte-aligned char
and 5-bit bitfield, as follows:bitfield of size zero. A bitfield of zero size fills the container up to the end
if the container is not empty. A subsequent bitfield declaration starts a new
empty container.
Note
container with unspecified values when a bitfield is written. This does not
affect normal usage of bitfields.
Bitfields in packed structures
packed structures, have an alignment of 1. Therefore the maximum bit padding
inserted to align a packed bitfield container is 7 bits.
8*sizeof(container-type)-1
bits.ensure arrays of the structure will have their elements correctly aligned.
the bitfield that declared it. Non-packed bitfield containers are the size of
their type.
struct A { int z:17; }; // sizeof(A) = 4, alignment = 4
struct A { __packed int z:17; }; // sizeof(A) = 3, alignment = 1
__packed struct A { int z:17; }; // sizeof(A) = 3, alignment = 1
struct A { char y:1; int z:31; }; // sizeof(A) = 4, alignment = 4
struct A { char y:1; __packed int z:31; }; // sizeof(A) = 4, alignment = 1
__packed struct A { char y:1; int z:31; }; // sizeof(A) = 4, alignment = 1
struct A { char y:1; int z:32; }; // sizeof(A) = 8, alignment = 4
struct A { char y:1; __packed int z:32; }; // sizeof(A) = 5, alignment = 1
__packed struct A { char y:1; int z:32; }; // sizeof(A) = 5, alignment = 1
struct A { int x; char y:1; int z:31; }; // sizeof(A) = 8, alignment = 4
struct A { int x; char y:1; __packed int z:31; }; // sizeof(A) = 8, alignment = 4
__packed struct A { int x; char y:1; int z:31; }; // sizeof(A) = 8, alignment = 1
struct A { int x; char y:1; int z:32; }; // sizeof(A) = 12, alignment = 4 [1]
struct A { int x; char y:1; __packed int z:32; }; // sizeof(A) = 12, alignment = 4 [2]
__packed struct A { int x; char y:1; int z:32; }; // sizeof(A) = 9, alignment = 1
struct example1
{
int a : 8; /* 4-byte container at offset 0 */
__packed int b : 8; /* 1-byte container at offset 1 */
__packed int c : 24; /* 3-byte container at offset 2 */
}; /* Total size 8 (3 bytes tail padding) */;
struct example2
{
__packed int a : 8; /* 1-byte container at offset 0 */
__packed int b : 8; /* 1-byte container at offset 1 */
int c : 8; /* 4-byte container at offset 0 */
}; /* Total size 4 (No tail padding) */
struct example3
{
int a : 8; /* 4-byte container at offset 0 */
__packed int b : 32; /* 4-byte container at offset 1 */
__packed int c : 32; /* 4-byte container at offset 5 */
int d : 16; /* 4-byte container at offset 8 */
int e : 16; /* 4-byte container at offset 12 */
int f : 16; /* In previous container */
}; /* Total size 16 (No tail padding) */
Non-Confidential | ARM DUI0375E | |
Copyright 2007, 2008, 2011, 2012, 2014 ARM. All rights reserved. |
Home > C and C++ Implementation Details > Structures, unions, enumerations, and bitfields in ARM C and C++ |
struct X
{
int x:10;
char y:8;
int z:5;
}
Structures, unions, enumerations, and bitfields in ARM C and C++的更多相关文章
- delphi 保存网页MHT
delphi 保存网页MHT uses ADODB_TLB, CDO_TLB, ComObj,MSHTML;{$R *.dfm}{能把网页如 WWW.QQ.COM保存为一个单文件 .MHT但不能把 ...
- Python C/C++ 拓展使用接口库(build-in) ctypes 使用手册
Python C/C++ 拓展使用接口库(build-in) ctypes 使用手册 ctypes 是一个Python 标准库中的一个库.为了实现调用 DLL,或者共享库等C数据类型而设计.它可以把这 ...
- [转]Keyword Reference (F#)
Visual F# Development Portal http://msdn.microsoft.com/en-us/library/vstudio/ff730280.aspx 本文转自:http ...
- c++学习书籍推荐《The C++ Programming Language第四版》下载
百度云及其他网盘下载地址:点我 作者简介 Bjarne Stroustrup is the designer and original implementer of C++, the author o ...
- Delphi 如何在程序中执行动态生成的Delphi代码
如何在程序中执行动态生成的Delphi代码 经常发现有人提这类问题,或者提问内容最后归结成这种问题 前些阵子有位高手写了一个“执行动态生成的代码”,这是真正的高手,我没那种功力,我只会投机取巧. 这里 ...
- Swift声明参考
一条声明可以在你的程序里引入新的名字和构造.举例来说,你可以使用声明来引入函数和方法,变量和常量,或者来定义 新的命名好的枚举,结构,类和协议类型.你也可以使用一条声明来延长一个已经存在的命名好的类型 ...
- Core Java Volume I — 1.2. The Java "White Paper" Buzzwords
1.2. The Java "White Paper" BuzzwordsThe authors of Java have written an influential White ...
- The Swift Programming Language-官方教程精译Swift(4)字符串和字符
String 是一个有序的字符集合,例如 "hello, world", "albatross".Swift 字符串通过 String 类型来表示,也可以表示为 ...
- LibVLC video controls
原文 http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__video.html VLC 3.0.0-git ...
- 《C++程序设计语言(英文第四版)》【PDF】下载
<C++程序设计语言(英文第四版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382177 内容简介 本书是C++领域经典的参 ...
随机推荐
- tortoisegit 配置ssh登录
习惯使用小乌龟. 服务器:gitblit 客户端:TortoiseGit 2.13.0.1 (C:\Program Files\TortoiseGit\bin) git version 2.36.1. ...
- 07-Python异常处理
什么是异常? Python无法正常处理程序时就会发生一个异常,这时Python就会抛出一个对象,表示这是一个错误. 必须处理异常,否则程序可能会停止运行,或者出现异常现象. 如:4/0就会抛出异常,因 ...
- 看李沐的 ViT 串讲
ViT 概括 论文题目:AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 论文地址:https:// ...
- github中的子模块(git submodule)
git中支持引用另外一个开源库,并且可以指定依赖的分支或者提交记录号. 比如fltk-rs 库的fltk-sys模块依赖了库 cfltk 并指明了依赖的提交是 8a56507 甚至可以嵌套,毕竟库自身 ...
- java生成word的解决方案比较
1.Jacob Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁.通过Jacob实现了在Java平台上对微软Office的COM接口进行调用. 优点:调 ...
- 探究kubernetes 探针参数periodSeconds和timeoutSeconds
探究kubernetes 探针参数 periodSeconds和timeoutSeconds 问题起源 kubernetes probes的配置中有两个容易混淆的参数,periodSeconds和ti ...
- 【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
介绍一个简单的工具,用于将Redis数据从一个redis端点复制到另一个redis端点,基于原始存储库转换为.NET 8:https://github.com/LuBu0505/redis-copy- ...
- supervisor.conf部署及维护
启动服务 supervisord -c /etc/supervisord.conf 启动服务 supervisorctl start 关闭服务 supervisorctl stop
- ngnix简介和基础
一.Nginx简介 Nginx 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP代理服务器 是一个模块化软件 [1].安装nginx 使用源码包编译安装 cd /opt ...
- java面试一日一题:说下mysql中的binlog
问题:请讲下mysql中的binlog 分析:该问题主要考察对mysql中binlog的理解及使用场景? 回答要点: 主要从以下几点去考虑, 1.什么是binglog? 2.binlog的使用场景是什 ...