在硬件级别的“for循环”中会发生啥?内存是自动分配的吗? (C++)[关闭]
Posted
技术标签:
【中文标题】在硬件级别的“for循环”中会发生啥?内存是自动分配的吗? (C++)[关闭]【英文标题】:What occurrs in a 'for loop' at the hardware level? Is memory automatically assigned? (C++) [closed]在硬件级别的“for循环”中会发生什么?内存是自动分配的吗? (C++)[关闭] 【发布时间】:2015-08-16 19:26:48 【问题描述】:我这里有一些代码可以反转字符数组:
#include <iostream>
#include <string>
using namespace std;
char s[50];
void reverseChar(char * s)
for (int i=0; i<strlen(s)/2; ++i)
char temp = s[i];
s[i] = s[strlen(s)-i-1];
s[strlen(s)-i-1] = temp;
int main()
cout << "Hello, this program reverses words." << endl << endl;
cout << "Enter in a word, no spaces please:" << endl;
cin.getline(s, 50);
cout << "This is the word, it has now been reversed:" << endl;
reverseChar(s);
cout << s;
return 0;
在 for 循环中,有人可以解释硬件级别发生了什么。我知道'temp'被分配给一个字节,它被分配给s[i]的值。
内存是否分配给所有东西?
等号、s[i] 等?
在字节被赋值给s[i]中的值之后,s[i]被赋值给数组s中的某个其他值。然后将这个其他值分配给 temp。
我无法理解所有这些字节的去向,以及它们是如何被 C++ 操纵的。
我明白了:
s[i] = s[strlen(s)-i-1];
占位符值正在交换?
在这一行:
s[strlen(s)-i-1] = temp;
“复制”值被发送到“临时”。但是之后这个 temp 值会发生什么,一旦 for 循环重复,它会变成新的“temp”吗?
【问题讨论】:
您需要学习计算机体系结构以及编译器如何工作的课程。 :) 那么你为什么想知道所有这些底层细节呢? @user3528438 你在讽刺吗? OP 并没有询问“低级细节”,尽管他认为他是。他实际上表现出明显缺乏对 C++ 语法如何工作的理解,正如 Lightness 指出的那样,C++ 代码如何被翻译成机器代码(对有效使用任何编译语言的基本理解是必不可少的)。没有什么是更多研究无法解决的。 一些旁注: 1. 在这种情况下,将变量s
声明为全局是一个坏主意(通常情况下,除非你真的需要它)。无论如何,如果它是全局的,那么您就不需要将它传递给函数,而且,使用同名的局部变量会使您的代码更不可读。
(续:) 在函数范围内,编译器会优先选择局部变量而不是全局变量,并且由于您使用全局变量调用函数,因此即使编译器选择了全局变量,然而,整个事情似乎毫无意义。只需在函数main
中声明变量,并在需要时将其传递给其他函数。 2. 您在for
循环内调用了strlen(s)
3 次。在循环之前调用一次,并使用返回值。
【参考方案1】:
在for循环中,有人可以解释硬件发生了什么吗 等级。我知道'temp'被分配给一个字节,它被分配 到 s[i] 的值。
内存是否分配给所有东西?
是的,它已分配,但在堆栈上。你需要了解栈和堆的区别。
是的,所有变量都以某种形式的内存表示。但话又说回来,根据上下文,它可能是堆栈或堆。
等号、s[i] 等?
Equals 是一个运算符,用于通知编译器正在进行赋值操作,因此不需要内存。 另一方面,s[i] 是一个数组对象,在堆栈内存中表示。
“镜像”值被发送到“临时”。但是这个温度会发生什么 之后的值,一旦 for 循环,它是否会成为新的“临时”? 重申?
因为,在循环中您已将 temp 声明为,
char temp;
每次迭代都会在堆栈中创建一个新变量 temp。
我强烈建议您阅读典型操作系统中的内存组织。您可以从here 开始。
编辑:还要注意,根据变量的范围,编译器会根据堆栈变量的范围自动取消分配内存。对于上面的 temp 变量,它的作用域在 for 循环结束时结束,因此它在那个时候被销毁。因此,编译器最终不会为每次迭代分配一个字符空间。
【讨论】:
这里的一切都是正确的。作为一个小的澄清,堆栈空间不会随着循环的每次迭代而增长。编译器足够聪明,可以重用堆栈上的相同内存地址来为每次循环迭代存储temp
。
没错,澄清了那部分以上是关于在硬件级别的“for循环”中会发生啥?内存是自动分配的吗? (C++)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章