- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在开发几个需要跨多个桌面和移动平台移植的 C 和 C++ 项目。我知道在我向磁盘读写数据时使用明确大小的类型 u32_t i64_
t 等很重要。
使用所有整数类型的显式大小类型来确保一致执行是否是个好主意?我听说显式大小的类型会影响性能,因为处理器针对它们预期的 int
类型等进行了优化。我还读到一个好的策略是在内部为类数据成员使用显式大小的类型,而不是在接口(interface)中。
关于数据成员和接口(interface)上明确大小的类型,是否有任何最佳实践? (我假设在这些情况下 C 或 C++ 之间不会有很大的区别,但如果有的话请告诉我)
最佳答案
基本“int”类型的好处在于,对于您当前正在编译的任何平台,它几乎总是最快的整数类型。
另一方面,使用 int32_t(而不仅仅是 int)的优点是您的代码可以指望 int32_t 始终是 32 位宽,无论它是在什么平台上编译的,这意味着您可以安全地与使用 int 相比,对值的行为做出更多假设。对于固定大小的类型,如果您的代码完全可以在新平台 Y 上编译,那么它的行为更有可能与在旧平台 X 上完全相同。
int32_t 的(理论上的)缺点是新平台 X 可能不支持 32 位整数(在这种情况下,您的代码根本无法在该平台上编译),或者它可能支持它们但处理它们的速度比它慢将处理普通的旧整数。
上面的例子有点做作,因为几乎所有现代硬件都全速处理 32 位整数,但确实存在(并且确实存在)处理 int64_ts 比处理 int 慢的平台,因为 (a) CPU 有32 位寄存器,因此必须将每个操作分成多个步骤,当然 (b) 64 位整数将占用 32 位整数两倍的内存,这会给缓存带来额外的压力。
但是:请记住,对于人们编写的 99% 的软件,这个问题不会对性能产生任何可观察到的影响,仅仅是因为如今 99% 的软件都不受 CPU 限制,并且即使对于这样的代码,整数宽度也不太可能成为主要的性能问题。所以真正归结为,您希望您的整数数学如何表现?
如果您希望编译器保证您的整数值始终占用 32 位 RAM,并且始终以 2^31(或 2^32 对于无符号),无论您在哪个平台上进行编译,请使用 int32_t(等)。
如果您真的不关心包装行为(因为您知道您的整数永远不会包装,因为它们存储的数据的性质),并且您想让代码更具可移植性对于奇怪/不寻常的编译目标,并且至少在理论上更快(尽管在现实生活中可能不是),那么您可以坚持使用普通的旧 short/int/long。
我个人默认使用固定大小的类型(int32_t 等),除非有非常明确的理由不这样做,因为我想尽量减少跨平台的变体行为。例如,这段代码:
for (uint32_t i=0; i<4000000000; i++) foo();
... 将始终恰好调用 foo() 4000000000 次,而这段代码:
for (unsigned int i=0; i<4000000000; i++) foo();
可能调用 foo() 4000000000 次,或者它可能进入无限循环,具体取决于 (sizeof(int)>=4) 与否。当然,可以手动验证第二个代码段不会在任何给定平台上执行此操作,但考虑到两种样式之间的性能差异可能为零,我更喜欢第一种方法,因为预测其行为是轻而易举的事。我认为 char/short/int/long 方法在 C 的早期更有用,当时计算机体系结构更加多样化,而且 CPU 足够慢,实现完整的 native 性能比安全编码更重要。
关于c++ - 在 C 系列语言中使用明确大小的类型的缺点或权衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10221486/
这个问题在这里已经有了答案: C sizeof a passed array [duplicate] (7 个回答) 8年前关闭。 在一个函数中,我声明了一个数组: int char_count_ar
简而言之,文件系统如何与 block 设备通信? 最佳答案 我对 block 大小不太了解。我认为 ext4(Linux)的文件系统的 block 大小是 4KB,考虑到现代处理器的页面大小(4KB)
我知道 tinyint(1) 和 tinyint(2) 具有相同的存储空间范围。 唯一的区别是显示宽度不同。这是否意味着 tinyint(1) 将存储所有类型的整数但只正确显示 0 到 9 的范围?而
今晚我已经研究了以下代码几个小时,但我只是摸不着头脑。 当使用函数从标准输入填充数组时,我不断收到“大小 8 的无效写入”和“大小 8 的无效读取”。 如有任何帮助,我们将不胜感激...我知道 Sta
我有一个 valgrind 错误,我不知道如何摆脱它们: ==5685== Invalid read of size 8 ==5685== at 0x4008A1: main (in /home
我对 Hadoop 的概念有点困惑。 Hadoop block 大小、拆分大小和 block 大小 之间有什么区别? 提前致谢。 最佳答案 block 大小和 block 大小相同。 拆分大小 可能与
我想不出一个好的标题,所以希望可以。 我正在做的是创建一个离线 HTML5 webapp。 “出于某些原因”我不希望将某些文件放在缓存 list 中,而是希望将内容放在 localStorage 中。
无法将 xamarin apk 大小减少到 80 MB 以下,已执行以下操作: 启用混淆器 配置:发布 平台:事件(任何 CPU)。 启用 Multi-Dex:true 启用开发人员检测(调试和分析)
我正在开发一个程序,需要将大量 csv 文件(数千个)加载到数组中。 csv 文件的尺寸为 45x100,我想创建一个尺寸为 nx45x100 的 3-d 数组。目前,我使用 pd.read_csv(
Hello World 示例的 React Native APK 大小约为 20M (in recent versions),因为支持不同的硬件架构(ARMv7、ARMv8、X86 等),而同一应用程
我有一个包含 n 个十进制元素的列表,其中每个元素都是两个字节长。 可以说: x = [9000 , 5000 , 2000 , 400] 这个想法是将每个元素拆分为 MSB 和 LSB 并将其存储在
如何设置 GtKTextView 的大小?我想我不能使用 gtk_widget_set_usize。 最佳答案 您不能直接控制小部件的大小,而是由其容器完成。您可以使用 gtk_widget_set_
这个问题在这里已经有了答案: c++ sizeof() of a class with functions (7 个答案) 关闭 5 年前。 结果是 12。 foobar 函数存储在内存中的什么位置
当我在 ffmpeg(或任何其他程序)中使用这样的命令时: ffmpeg -i input.mp4 image%d.jpg 所有图像的组合文件大小总是比视频本身大。我尝试减少每秒帧数、降低压缩设置、模
我是 clojurescript 的新手。 高级编译后出现“77 KB”的javascript文件是否正常? 我有一个 clojurescript 文件: 我正在使用 leinigen: lein c
我想要一个 QPixmap尺寸为 50 x 50。 我试过 : QPixmap watermark(QSize(50,50)); watermark.load(":/icoMenu/preparati
我正在尝试从一篇研究论文中重新创建一个 cnn,但我对深度学习还是个新手。 我得到了一个大小为 32x32x7 的 3d 补丁。我首先想执行一个大小为 3x3 的卷积,具有 32 个特征和步幅为 2。
我一直在尝试调整 View Controller 内的 View 大小,但到目前为止没有运气。基本上,我的 View 最底部有一个按钮,当方向从纵向更改为横向时,该按钮不再可见,因为它现在太靠下了。
如何使用此功能检查图像的尺寸?我只是想在上传之前检查一下... $("#LINK_UPLOAD_PHOTO").submit(function () { var form = $(this);
我用 C++ 完成了这个,因为你可以通过引用传递参数。我无法弄清楚如何在 JavaScript 中执行此操作。我的代码需要更改什么?我的输出是1 this.sizeOfBst = function()
我是一名优秀的程序员,十分优秀!