在硬件级别的“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++)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

java,多层for()循环,if()else嵌套分别用啥替代?

BeginProcessRequest() 中会发生啥?

中止请求时 IIS/C# 中会发生啥

电脑不断重启是啥原因

在vb中 啥是循环语句 啥意思

java中大量使用二维数组和for循环会发生内存泄露吗?该怎么解决?