Tag: 可移植性

GCC中是否有固定大小的整数?

在MSVC ++编译器上,可以对特定大小的整数使用__int8 , __int16 , __int32和类似类型。 这对于需要使用低级数据结构(如自定义文件格式,硬件控制数据结构等)的应用程序非常有用。 我可以在GCC编译器上使用类似的等价物吗?

在C / C ++中,volatile变量是否保证最终在线程之间具有一致的语义?

任何通常遵循的标准(ISO C或C ++,或任何POSIX / SUS规范)是否有任何保证,由多个线程访问的变量(可能标记为volatile)(未被互斥锁保护)将最终保持一致如果分配给? 要提供一个特定示例,请考虑共享变量v的两个线程,初始值为零。 线程1:v = 1 线程2:while(v == 0)yield(); 线程2是否保证最终终止? 或者它可以想象永远旋转,因为缓存一致性永远不会启动并使得赋值在线程2的缓存中可见? 我知道C和C ++标准(在C ++ 0x之前)完全没有关于线程或并发的说法。 但我很好奇,如果C ++ 0x内存模型,或pthreads,或其他任何东西,保证这一点。 (显然这确实可以在Windows上运行32位x86;我想知道它是否可以依赖于某些东西,或者它是否恰好在那里工作)。

64位浮点移植问题

我正在将我的应用程序从32位移植到64位。 目前,代码在两种架构下编译,但结果不同。 由于各种原因,我使用浮动而不是双打。 我假设在一台机器上有一些从浮动到双重的隐式上转换而不是另一台机器。 有没有办法控制这个,或者我应该寻找的具体问题? 编辑添加: 32位平台 gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-33) Dual-Core AMD Opteron(tm) Processor 2218 HE 64位平台 gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3 Intel(R) Xeon(R) CPU 应用-mfpmath = 387有点帮助,在算法的1次迭代之后,值是相同的,但除此之外,它们再次失去同步。 我还要补充一点,我的担心并不是结果不一样,而是移植到64位平台已经发现了32位依赖关系,我不知道。

当sizeof(char)!= 1时,C中的字节精度指针算术

如何以单字节精度可移植地执行指针运算? 请记住: char在所有平台上都不是1个字节 sizeof(void) == 1仅作为GCC中的扩展名提供 虽然某些平台可能具有指针deref指针对齐限制,但算术仍可能需要比最小基本POD类型的大小更精细的粒度

C ++中的固定宽度整数

偶尔我需要使用固定宽度的整数与PLC等外部设备进行通信。 我还使用它们来定义位掩码并执行图像数据的位操作。 AFAIK C99标准定义了固定宽度的整数,如int16_t。 但是我使用的编译器,VC ++ 2008不支持C99和AFAIK微软不打算支持它。 我的问题是在C ++中使用固定宽度整数的最佳实践是什么? 我知道VC ++定义了非标准的固定宽度整数,如__int16,但我对使用非标准类型犹豫不决。 下一个C ++标准是否会定义固定宽度的整数?

如何确定宽度是“int”和“unsigned”两倍的整数类型?

中间乘法的值通常需要两倍的位数作为输入。 // Example int foo(int a, int b, int carry, int rem) { int2x c; // Some type that is twice as wide at `int` c = (int2x)a * b + carry; return (int) (c % rem); } 考虑到填充的可能性(似乎限制了sizeof()有用性)和非2的补码整数(限制了位误),…… 以下是否始终创建所需类型? 如果没有,如何编写至少一个合理的解决方案,即使不完全可移植? #include #include #if LONG_MAX/2/INT_MAX – 2 == INT_MAX typedef long int2x; typedef unsigned long […]