小编som*_*ver的帖子

"int"和"int_fast16_t"有什么区别?

据我了解,C规范说该类型int应该是目标平台上包含至少16位的最有效类型.

那不就是C99的定义int_fast16_t吗?

也许他们只是为了保持一致而把它放在那里,因为int_fastXX_t需要另一个?

更新

总结下面的讨论:

  • 我的问题在许多方面都是错误的.C标准没有为int指定位数.它给出了必须包含的范围[-32767,32767].
  • 我开始意识到,大多数人会说,"但这个范围至少意味着16位!" 但是C不需要二进制补码(甚至是二进制)整数存储.如果他们说"16位",可能会有一些平台具有1位奇偶校验,1位符号和14位幅度,仍然"符合标准",但不满足该范围.
  • 标准没有说int是最有效的类型.除了上面的大小要求之外,int可以由编译器开发人员根据他们认为最重要的标准来决定.(速度,大小,向后兼容性等)
  • 另一方面,int_fast16_t就像向编译器提供一个提示,它应该使用对性能最佳的类型,可能以牺牲任何其他权衡为代价.
  • 同样,int_least16_t会告诉编译器使用> = 16位的最小类型,即使它会更慢.适用于保留大型阵列和空间中的空间.

示例: x86-64上的MSVC具有32位int,即使在64位系统上也是如此.MS选择这样做是因为太多人认为int总是正好是32位,因此很多ABI会破坏.但是,如果x86-64上的64位值更快,则int_fast32_t可能是64位数.(我不认为实际情况如此,但它只是证明了这一点)

c int portability c99 c89

38
推荐指数
3
解决办法
6431
查看次数

为什么Rust允许使用不可变绑定通过引用字段进行突变?

如果我有一个绑定到结构的不可变变量,Rust通常不允许我改变结构的字段或拥有的子结构的字段.

但是,如果该字段是一个可变引用,Rust 允许我改变引用的对象,尽管我的绑定是不可变的.

为什么允许这样做?它与Rust的不变性的正常规则不一致吗?

Rust 不会让我通过不可变引用做同样的事情,因此不可变引用具有与不可变引用不同的行为.

代码示例:

struct Bar {
    val: i32,
}

struct Foo<'a> {
    val: i32,
    bar: Bar,
    val_ref: &'a mut i32,
}

fn main() {
    let mut x = 5;

    {
        let foo = Foo { 
            val: 6, 
            bar: Bar { val: 15 },
            val_ref: &mut x
        };

        // This is illegal because binding is immutable
        // foo.val = 7;

        // Also illegal to mutate child structures
        // foo.bar.val = 20;

        // This is fine …
Run Code Online (Sandbox Code Playgroud)

rust

9
推荐指数
1
解决办法
834
查看次数

使用临时来初始化多个成员

在较旧的C++ 98中,我不相信有任何好方法可以在初始化列表中重用临时结果来初始化对象的多个成员.

在较新版本的C++(11,14,17)中,这有没有改变?

请考虑以下代码:

//
// compileShaders()
//
// Takes a string containing the source code to possibly hundreds of shaders 
// for an effect (In this case, there are only 2 shaders for this effect)
//
// Returns a vector of compiled bytecode for each shader in the effect
//
std::vector<std::string> compileShaders(
    const std::string& sourceCode, 
    const RenderTargetLayout& layout);

//
// class ScaleDownEffect
//
// Scales image to 1/4 in each dimension by using two 1/2 passes
//
class ScaleDownEffect …
Run Code Online (Sandbox Code Playgroud)

c++ constructor initialization-list

6
推荐指数
2
解决办法
138
查看次数

是否在有符号的固定宽度整数上定义和移植了按位运算?

我的理解是,对常规 ol' short/int/long 类型的某些按位运算要么是依赖于实现的( | & ~ >> ),要么是未定义的( << )

然而,C99 引入了固定宽度的整数类型,并明确地将它们定义为没有填充位的二进制补码精确位。

这是否意味着所有按位运算对于提供它们的平台之间的那些类型来说都是明确定义和可移植的?

例如,这可以在 My Machine™ 上运行,但它保证可以运行吗?

#include <inttypes.h>
#include <stdio.h>

int main() {
  uint16_t a = 0xffff;
  int16_t b = *(int16_t*)(&a);

  printf("%" PRId16 "\n", b);

  // Prints '-1'

  b <<= 4;

  printf("%" PRId16 "\n", b); 

  // Prints '-16'

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c language-lawyer

2
推荐指数
1
解决办法
75
查看次数