我认为我已经很好地理解了C++是如何工作的,但我对它的一部分用法感到困惑。如果我在.cpp文件中全局声明一个类实例(不与类关联),如下所示
Class b(constructor parameters)
这不会造成问题。我的理解是,以这种方式声明类是在堆栈框架中为它们所在的方法分配它们,而不是在堆上。但是如果我在全局范围内声明这一点,那么就没有方法,因此也就没有堆栈框架,对吧?为什么我被允许这样做,更重要的是发生了什么,这在C++中是不是某种大不?
当用C在堆栈上分配一个int和一个大数组时,程序执行时不会出错。但是,如果我提前初始化堆栈上的变量,它就会出现分段错误(可能是因为大数组超过了堆栈大小)。如果在声明数组之后初始化变量,这对我来说是有意义的。是什么导致了这种行为,记忆智慧?
我当时的印象是,只要在堆栈上声明一个变量,就会分配所需的空间,从而导致在分配非常大的数据类型时立即崩溃。
我怀疑这与编译器优化它有关,但这是没有意义的,因为我在第二个示例中也没有更改foo。
我使用gcc 7.2.0编译,没有设置任何标志。在Ubuntu 17.10执行。
它运行时没有错误:
int main(){
int i;
unsigned c
我一直在处理一个受启发的默认构造函数示例。这个很好用:
class Foo {
public:
int x;
Foo() = default;
};
int main() {
for (int i = 0; i < 100; i++) {
Foo* b = new Foo();
std::cout << b->x << std::endl;
}
但是,当我在堆栈上使用一个类实例进行测试时,它不会!例如,如果我像Foo b一样实例化类,就会得到一个错误,该错误表示未初始化的局部变量
我正在开发一个使用XNA和C#的游戏,并试图避免调用每一帧的new struct()类型代码,因为我认为这会吓坏GC。“等等,”我对自己说,"struct是一种值类型。GC不应该被调用,对吧?“好吧,这就是为什么我在这里问。
对于值类型会发生什么,我只有一个非常模糊的概念。如果我在函数调用中创建了一个新的结构,那么该结构是在堆栈上创建的吗?它会被简单地推送和弹出,而性能不会受到影响吗?此外,如果我需要在一次调用中创建多个实例,是否会有一些内存限制或性能影响?
以下面的代码为例:
spriteBatch.Draw(tex, new Rectangle(x, y, width, heigh
我读到声明和定义全局变量是有区别的。我的理解是,在下面的代码中,"a“是在主目录之外声明的(在刚刚声明时没有分配内存),并且只有当值真正分配给它时才定义。但是在变量C的情况下,没有分配内存,因为没有使用它。对于变量d,则为声明和初始化。还是声明意味着使用extern关键字声明变量?
在变量d的情况下还会发生什么呢?如果它不在任何地方使用,编译器会删除它吗?
int a; // declaration
int c; // declaration
int d=10;
int main (void)
{
a=50; // a is now allocated memor
什么是字节溢出?
当我从C程序生成的x86中间表示转储LLVM时,有许多溢出,通常是4字节大小。我不明白它们为什么会发生,以及它们实现了什么。
它们似乎“切掉”了堆栈的一部分,但却以一种不同寻常的方式:
## this fragment comes from a C program right before a malloc() call to a struct.
## there are other spills in different circumstances in this same program, so it
## is not related exclusively to ma
如本教程所述:
在计算机编程中,堆栈是一个容器,它包含其他变量(很像数组)。但是,虽然数组允许您按任意顺序访问和修改元素,但堆栈则更有限。可以在堆栈上执行的操作与上面的操作相同:
1)查看堆栈上的顶级项(通常通过一个名为top ()2的函数完成),将顶部项从堆栈中删除(通过名为pop()3的函数完成),将一个新项放到堆栈的顶部(通过名为push()的函数完成)
但是,如果我在C++中定义了两个变量,我就不必按照相同的定义顺序使用它们:
示例:
int main() {
int a;
int b;
b = 5;
a = 6;
}
这个代码有问题吗?我可以按我喜欢的任何顺序使用!!我不
我已经研究这个问题好几个小时了,尝试了所有的方法,但所有的结果都是一样的- SIGSEGV (来自gdb;根据VC debug,它是一个堆栈溢出...)在调用静态类方法时。
罪魁祸首:
void LEHelper::copySinglePath (std::string from_path, std::string to_path)
{
// first check if this path is a file or folder
if (!folderExists(from_path)) // is a file
{
FILE *fp = fopen(
以这个例子为例。
#include "stdio.h"
int global_var=5;
int main ()
{
int local_var=6;
//some statements
return 0;
}
如果main函数是唯一的入口点,那么global_var的声明和赋值发生在什么时候?
需要注意的是,global_var是在堆中还是在堆栈中分配的?另外,有没有一种方法可以从一个函数声明一个全局变量,同时尊重入口点?
假设您有这些调用(JavaScript,只是为本文提供这一功能):
function start() {
let a = 10
let x = doX(a)
let b = 20
doY(a, b + x)
b = 30
x--
return doZ(a + (b * x))
}
function doX(x) {
let a = x * 2
let b = doZ(x) + 2
return doZ(a + b)
}
function doY(x, y) {
fs.writeFileSync(`${x + y}.txt`, 'hello
在C中,当有一个函数返回指向它的一个本地变量(在堆栈上)的指针时,调用函数将得到null返回。为什么会发生这种事?
我可以在我的硬件上用C语言完成这个任务。
void A() {
int A = 5;
}
void B() {
// B will be 5 even when uninitialised due to the B stack frame using
// the old memory layout of A
int B;
printf("%d\n", B);
}
int main() {
A();
B(
我在使用Visual 15编译某些内容时遇到了一个问题。这段代码说明:
const char* getx() { return "foo"; }
void __declspec(naked) nf()
{
static const char* x = getx();
}
如果出现以下错误,就会失败:Error C3068 'nf': a 'naked' function cannot contain objects that would require unwinding if a C++ exception occurred。不过
我的理解是,在C和C++中,我们创建数据结构,其大小在堆栈的编译时已知,我们使用堆(malloc无/新删除)来处理在编译时不知道大小并在运行时决定的事情。那么,为什么我的g++编译器允许我执行如下代码片段。
int main(void)
{
int n ;
cin >> n ; // get the size of array.
int arr[n] ; // create a variable sized array.
.... do other stuff ...
}
具体来说,在数组的情况下:
数组在堆栈上分配一个连续的内存块,堆栈上和下面都有
说:“如果一个NewExpression被用作带有作用域存储类的函数局部变量的初始化器,并且ArgumentList到new是空的,那么实例将在堆栈上分配,而不是在堆上分配,或者使用类特定的分配器。”
这是否意味着在下面的程序中,C的一个对象完全在堆栈上分配,而没有任何堆分配?
class C {
int x;
}
void main() {
scope c = new C();
}
另外:为什么它只适用于空参数列表?
我怀疑我是否正确理解,因为我读到的所有其他D材料都说,类是在堆中分配的。我想确认一下。
我的C++程序接受三个整数输入,并进行一些计算,包括除法。起初,最终的结果不是十进制。在堆栈溢出()上搜索了一点之后,我发现我应该添加一个(浮点数),如下所示:
int a;
int b;
float c;
a = 5;
b = 2;
c = (float)a / b;
所以我试了一下,但最终得到的结果是-nan(ind)。首先,这是什么意思?第二,如何使我的程序工作?
顺便提一下,这是我在程序中要做的数学。
int v;
int e;
int a;
float r;
r = ((float)e - v) / ((float)a / 1000);
编辑:对不起,我错了。我的意思是在第二个
据我所知,每个线程通常只有一个堆栈(而进程中的所有线程通常共享一个堆)。我一直认为堆栈是用来存储发生函数调用时程序计数器(PC)的值的。但是后来我在某处读到,某些变量类型,如integer或boolean,也被分配到堆栈上。由于堆栈上的值是以严格的FILO方式管理的,如何在任何时候检索这些变量?
例如,在声明int a, b, c;之后,我可以在它们的作用域内的任何时间以任何顺序对这些变量做任何我想做的事情。这是怎么做的?为什么值c不在堆栈的顶部,因此隐藏了值a, b