【问题标题】: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 次。在循环之前调用一次,并使用返回值。

标签: c++ arrays for-loop memory char


【解决方案1】:

在for循环中,有人可以解释硬件发生了什么吗 等级。我知道'temp'被分配给一个字节,它被分配 到 s[i] 的值。

内存是否分配给所有东西?

是的,它已分配,但在堆栈上。你需要了解栈和堆的区别。

是的,所有变量都以某种形式的内存表示。但话又说回来,根据上下文,它可能是堆栈或堆。

等号、s[i] 等?

Equals 是一个运算符,用于通知编译器正在进行赋值操作,因此不需要内存。 另一方面,s[i] 是一个数组对象,在堆栈​​内存中表示。

“镜像”值被发送到“临时”。但是这个温度会发生什么 之后的值,一旦 for 循环,它是否会成为新的“临时”? 重申?

因为,在循环中您已将 temp 声明为,

char temp;

每次迭代都会在堆栈中创建一个新变量 temp。

我强烈建议您阅读典型操作系统中的内存组织。您可以从here 开始。

编辑:还要注意,根据变量的范围,编译器会根据堆栈变量的范围自动取消分配内存。对于上面的 temp 变量,它的作用域在 for 循环结束时结束,因此它在那个时候被销毁。因此,编译器最终不会为每次迭代分配一个字符空间。

【讨论】:

  • 这里的一切都是正确的。作为一个小的澄清,堆栈空间不会随着循环的每次迭代而增长。编译器足够聪明,可以重用堆栈上的相同内存地址来为每次循环迭代存储temp
  • 没错,澄清了那部分
猜你喜欢
  • 2019-03-14
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多