首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >uint8、uint16等的使用

uint8、uint16等的使用
EN

Stack Overflow用户
提问于 2013-02-25 07:55:37
回答 9查看 55.7K关注 0票数 22

目前,我正在使用一个针对32位MIPS平台的代码库(C,C++混合)。处理器是一个相当现代的处理器,只需提到我们有很好的处理能力和内存。

代码库使用数据类型,如uint81字节宽无符号整数、uint162字节宽无符号整数、uint324字节宽度无符号整数等。

当将代码移植到不同的平台时,我知道如何使用这些构造。

我的问题是:

  1. 如果uint16也足够(如果有),那么使用uint32的好处是什么呢?
  2. 在使用较短的数据类型(考虑数据对齐)时,内存的使用会有节省吗?
  3. 如果要节省一些字节的内存,那么在现代硬件中这样做是否明智呢?
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-02-25 08:22:46

如果uint16也足够(如果有),那么使用uint32的好处是什么呢?

如果这些uint16s是数组或结构的一部分,那么您可以节省内存,并且可能能够处理比在相同的数组或结构中使用uint32s更大的数据集。这取决于你的代码。

数据协议和文件格式可能使用uint16s,而使用uint32s可能不正确。这取决于格式和语义(例如,如果您需要将值从65535包装到0,uint16将自动完成此操作,而uint32则不会)。

OTOH,如果这些uint16s只是单个局部变量或全局变量,用32位变量替换它们可能没有什么显著的区别,因为它们可能由于对齐而占据相同的空间,并且它们作为32位参数(在堆栈或寄存器中)传递到MIPS上。

在使用较短的数据类型(考虑数据对齐)时,内存的使用会有节省吗?

这可能会节省开支,特别是当uint16s是许多大数组的结构或元素的一部分时。

如果要节省一些字节的内存,那么在现代硬件中这样做是否明智呢?

是的,您降低了内存带宽(这总是一件好事),并且当您对较少的数据进行操作时,通常会降低各种缓存丢失(数据缓存和TLB)。

票数 23
EN

Stack Overflow用户

发布于 2013-02-25 10:03:36

首先,如果您已经定义了uint16之类的类型,那么它们在哪里定义呢?它们不是标准类型,因此将在某些专有的标头中定义--可能是您的,也可能是由某个第三方库提供的;在这种情况下,您必须问自己该代码的可移植性,以及您是否正在创建一个在其他应用程序中可能没有意义的依赖项。

另一个问题是,许多库(不明智地定义了IMO)使用各种名称(如UINT16、uint16、U16 UI16等)来定义这类类型,这在某种程度上成为了确保类型协议和避免名称冲突的噩梦。如果定义了这些名称,理想情况下,应该将它们放置在名称空间中,或者给它们指定一个特定于库的前缀,以指示定义了哪些库来使用它们,例如,rtos::uint16rtos_uint16

由于ISO C99标准库在stdint.h中提供了标准位长的特定类型,您应该更喜欢使用它们而不是在专有或第三方标头中定义的任何类型。这些类型有一个_t后缀,例如uint16_t。在C++中,它们可能被放置在std::名称空间中(尽管这不是给定的,因为标头是在C99中引入的)。

1]在使用uint16时,uint32也足够(如果有)有什么用处/好处?

除了我先前建议更喜欢stdint.huint16_t之外,至少有两个合理的理由可以使用特定长度的类型:

  1. 若要匹配特定硬件寄存器宽度,请执行以下操作。
  2. 在不同的体系结构中强制执行公共的、兼容的API。

2]使用较短的数据类型(考虑数据对齐)是否会节省内存使用?

有可能,但是如果内存不是你的问题,那就不是使用它们的好理由。对于大型数据对象或数组,可能值得考虑,但全局应用很少值得付出努力。

3)如果要节省几个字节的内存,那么在现代硬件中这样做是否明智呢?

见2。然而,“现代硬件”并不一定意味着大量的资源;例如,有大量32位ARM Cortex-M设备,只有几Kb的RAM。这更多的是关于模具空间,成本和功耗,而不是关于设计或建筑的时代。

票数 9
EN

Stack Overflow用户

发布于 2013-02-25 08:16:30

cstdint有用于不同目的的大量typedef

  • 特定宽度的intN_t
  • int_fastN_t表示最快的整数,它至少有N位
  • 最小整数的int_leastN_t,它至少有N位
  • 它们的unsigned等价项

你应该根据你的情况来选择。在一个std::vector中存储数千个,而不执行大量的计算?intN_t可能是你的人。需要对少量整数进行快速计算吗?int_fastN_t可能就是你的目标。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15062386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档