![]() |
1
1
这里没有说要将任何东西存储到任何内存中,除了
在有些不寻常但并非非常的情况下,编译器可能会使用额外的内存:
在任何普通的C实现中,编译器都不会生成一个完整的数组
|
![]() |
2
1
大多数计算机在处理器内部都有少量的专用内存区域,称为 登记簿 。它们在执行计算时用于临时工作,通常只有少数几个(大约10-100个):空间不足以容纳一个巨大的数组,但绝对足够处理单个数组元素。该内存不在RAM中,而是物理上内置在CPU中。 通常,当您在表达式中间将整数类型转换为浮点值时,处理器会将生成的浮点值存储在一个寄存器中,其长度刚好足以在计算表达式的其余部分时使用该值。如果在循环中执行此操作,通常但并非总是如此,CPU将在循环的每次迭代中使用相同的寄存器来保存临时浮点值。从这个意义上说,如果在循环内执行类型转换,则根本不需要新的内存。 现在,我在上面说通常和典型,因为这并不能保证会发生。代码的结构可能会使您在需要时没有可用的寄存器。编译器内的优化器可能会看到你想做什么,并以其他方式重写你的代码。但实际上,可以肯定的是,你会在这里得到一个寄存器,如果没有,它可能会在迭代中重复使用非常少量的RAM。 另一方面,如果你创建一个由n个浮点数组成的全新数组,并一次执行所有类型转换,你最终可能会使用n个sizeof(float)字节的存储空间,因为你已经明确要求空间来放置n个浮点。你得到的内存可能会在RAM中,因为浮点数太多,无法给每个浮点数一个寄存器。所以你应该假设这种方法需要更多的内存。如果你处理的是千兆字节的数据,这种方法可能会让人望而却步。 Ive在这里说可能,也可能是因为现在优化编译器非常擅长它们所做的事情,而且编译器可能会发现你只需要数组用于循环的目的,从而重写你的代码来进行类型转换。但依赖这一点可能并不好。 |
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 5 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 5 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 5 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 5 月前 |