在 putty 上使用 g++ 编译器进行编译是否会将我的代码传递给 linux 服务器?
Does compiling using the g++ compiler on putty pass my code to a linux server?
我在读大学,我们通常使用 putty 通过 g++ 编译我们的代码。
当我尝试使用 Visual Studio 在本地编译我的代码时,出现堆栈溢出错误。但是,在g++上使用putty编译时我没有。
我的假设是 Windows 有 1 MB 堆栈,Linux 有 8 MB 堆栈。当我使用 putty 使用 g++ 进行编译时,我将我的代码传递给 Linux 机器,因此有额外的堆栈 space.
有人可以帮我解决这个问题吗?
使用 putty 时,您可以通过 SSH 连接到 linux 服务器,然后您可以在该 linux 系统上编译代码。
在 linux 的提示符下,如果您的 shell 是 BASH
,那么我相信 ulimit -a
会显示所有内容的内存限制,包括 stacksize
。如果您的 shell 是 csh
或 tcsh
,则在提示符下键入 limit
以显示限制值。你可以通过 echo $SHELL
.
查看你的 shell 是什么类型
我使用 SUSE,我知道这些设置可以在 /etc/security/limits.conf
中找到。在这里,您可以调整 stacksize
上的默认 8MB。从 SUSE/SLES 10.1 开始,我体验到了 stacksize 的默认限制是 8MB。为什么他们将它设置为 8MB,我不知道它有什么安全隐患。多年来我一直在修改 limits.conf
以将 stacksize
设置为 unlimited
并且从未遇到过问题。
我不知道这个文件名和位置是否适用于所有其他发行版,或者 8MB 是否是其他发行版中的默认堆栈大小限制。
就像其他人在评论中所说的那样,在 main()
和其他函数中声明了大数组变量是导致问题的原因,因为当您执行程序时,这些变量被放置在堆栈中。如果 linux 操作系统在 stacksize
上设置了 8MB 的 hard/soft 限制,那么您 运行 您的程序在堆栈上需要超过 8MB 的内存 = 失败。
这些年来我 运行 多次遇到这个确切的问题 运行 在 linux 中编译代码,你编译没有问题然后转到 运行 它和它似乎只是在没有解释的情况下退出或崩溃——发生这种情况时,请始终检查操作系统对堆栈大小的 hard/soft 限制;将 stacksize 快速更改为 unlimited 将验证这是否是程序 运行s 完成的原因。
一个快速解决这个问题的方法是在 .c
或 .cpp
文件中在 main() 之外全局声明那些大变量;这是否是好的编程是另一回事。
linux 中有更多的自由,gcc 编译器将允许您编译代码以创建可执行文件,而无需检查或抱怨声明的变量超过堆栈大小的 hard/soft 限制。我不确定是否有 gcc、g++ 或 gfortran 的编译器选项可以在编译时检查声明的变量是否超过 stacksize 的值。你总是可以计算你声明的变量将使用的内存量:如果一个整数是 4 个字节,如果你这样做 int myarray[700]
那么那就是 2800 个字节,int myarray[700][700]
是 1,960,000 个字节,即 1.869MB。
我不知道 Microsoft Windows 中 stacksize 的默认限制是多少(您提到它可能是 1MB),但是对于 Visual Studio(我不太熟悉)它如果它在编译期间检查你声明的变量是否超过操作系统对堆栈大小的限制,我不会感到惊讶。
我在读大学,我们通常使用 putty 通过 g++ 编译我们的代码。 当我尝试使用 Visual Studio 在本地编译我的代码时,出现堆栈溢出错误。但是,在g++上使用putty编译时我没有。
我的假设是 Windows 有 1 MB 堆栈,Linux 有 8 MB 堆栈。当我使用 putty 使用 g++ 进行编译时,我将我的代码传递给 Linux 机器,因此有额外的堆栈 space.
有人可以帮我解决这个问题吗?
使用 putty 时,您可以通过 SSH 连接到 linux 服务器,然后您可以在该 linux 系统上编译代码。
在 linux 的提示符下,如果您的 shell 是 BASH
,那么我相信 ulimit -a
会显示所有内容的内存限制,包括 stacksize
。如果您的 shell 是 csh
或 tcsh
,则在提示符下键入 limit
以显示限制值。你可以通过 echo $SHELL
.
我使用 SUSE,我知道这些设置可以在 /etc/security/limits.conf
中找到。在这里,您可以调整 stacksize
上的默认 8MB。从 SUSE/SLES 10.1 开始,我体验到了 stacksize 的默认限制是 8MB。为什么他们将它设置为 8MB,我不知道它有什么安全隐患。多年来我一直在修改 limits.conf
以将 stacksize
设置为 unlimited
并且从未遇到过问题。
我不知道这个文件名和位置是否适用于所有其他发行版,或者 8MB 是否是其他发行版中的默认堆栈大小限制。
就像其他人在评论中所说的那样,在 main()
和其他函数中声明了大数组变量是导致问题的原因,因为当您执行程序时,这些变量被放置在堆栈中。如果 linux 操作系统在 stacksize
上设置了 8MB 的 hard/soft 限制,那么您 运行 您的程序在堆栈上需要超过 8MB 的内存 = 失败。
这些年来我 运行 多次遇到这个确切的问题 运行 在 linux 中编译代码,你编译没有问题然后转到 运行 它和它似乎只是在没有解释的情况下退出或崩溃——发生这种情况时,请始终检查操作系统对堆栈大小的 hard/soft 限制;将 stacksize 快速更改为 unlimited 将验证这是否是程序 运行s 完成的原因。
一个快速解决这个问题的方法是在 .c
或 .cpp
文件中在 main() 之外全局声明那些大变量;这是否是好的编程是另一回事。
linux 中有更多的自由,gcc 编译器将允许您编译代码以创建可执行文件,而无需检查或抱怨声明的变量超过堆栈大小的 hard/soft 限制。我不确定是否有 gcc、g++ 或 gfortran 的编译器选项可以在编译时检查声明的变量是否超过 stacksize 的值。你总是可以计算你声明的变量将使用的内存量:如果一个整数是 4 个字节,如果你这样做 int myarray[700]
那么那就是 2800 个字节,int myarray[700][700]
是 1,960,000 个字节,即 1.869MB。
我不知道 Microsoft Windows 中 stacksize 的默认限制是多少(您提到它可能是 1MB),但是对于 Visual Studio(我不太熟悉)它如果它在编译期间检查你声明的变量是否超过操作系统对堆栈大小的限制,我不会感到惊讶。