小编xcr*_*ypt的帖子

为什么内存会分成堆栈和堆?

可能重复:
堆栈和堆的内容和位置

我在堆栈和堆上有几个问题.

要知道的基本事情是堆栈比堆快,但是有限.(如我错了请纠正我).

但是,我总是想知道堆栈和堆是如何工作的.RAM只是一块内存,它不分为'堆栈'和'堆'(或者是它?).如果是这样,为什么我们首先将堆栈和堆中的内存分开?

操作系统可以让我们能够分配堆栈中的所有内容 - >一切都变得更快 - >幸福的世界?

我很确定事实并非如此.但为什么!?谁能给我一个深入的答案?

很抱歉,如果这篇帖子是某人发过的一些帖子的副本,那么有很多与堆栈和堆相关的帖子,我找不到我所拥有的确切问题.如果您碰巧知道一个,请继续并将其链接.

memory heap stack memory-management

34
推荐指数
2
解决办法
1万
查看次数

我什么时候应该在非成员函数之前写关键字'static'?

我最近static在函数之前看到了关于关键字的SO ,我想知道如何正确使用它.

1)我应该何时static在非成员函数之前编写关键字?

2)在标题中定义静态非成员函数是否危险?为什么不)?


(附带问题)

3)是否可以以某种方式在头文件中定义一个类,以便它只能在您首先使用它的翻译单元中使用?

(我问这个的原因是因为我正在学习STL,它可能是我的谓词等(可能是函子)的一个很好的解决方案,因为我不喜欢在cpp文件中定义除成员函数之外的函数)

(另外,我认为它与原始问题有关,因为根据我目前的推理,它会像static函数之前那样做)

编辑

在看到一些答案时出现的另一个问题:

4)很多人告诉我,我必须在头文件中声明静态函数,并在源文件中定义它.但静态函数对于翻译单元是唯一的.链接器怎样才能知道哪些翻译单元是独一无二的,因为头文件不直接涉及到一个源文件(仅当您包括他们)?

c++ linker static

23
推荐指数
2
解决办法
8279
查看次数

为什么关键字"typename"需要在合格的依赖名称之前,而不是在合格的独立名称之前?

class A
{
   static int iterator;
   class iterator
   {
      [...]
   };
   [...]
};
Run Code Online (Sandbox Code Playgroud)

我(我想)理解为什么typename需要这里:

template <class T>
void foo() {
   typename T::iterator* iter;
   [...]
}
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么typename不需要这里:

void foo() {
   A::iterator* iter;
   [...]
}
Run Code Online (Sandbox Code Playgroud)

谁能解释一下?


编辑:

编译器之所以没有后者的问题,我发现在评论中得到了很好的回答:

A::iterator我的情况下,我不明白为什么编译器不会混淆它static int iterator? - xcrypt

@xcrypt因为它知道两者A::iterator是什么,并且可以根据它的使用方式选择哪一个 - Seth Carnegie


typename我认为编译器在合格的从属名称之前需要的原因在Kerrek SB接受的答案中得到了很好的回答.请务必阅读有关该答案的评论,尤其是iammilind的评论:

"T :: A*x ;,对于T :: A是一个类型且T :: A是一个值的情况,这个表达式都可以为真.如果A是一个类型,那么它将导致指针声明;如果A是一个值,然后它将导致乘法.因此,单个模板对于2种不同类型将具有不同的含义,这是不可接受的."

c++ templates typename

17
推荐指数
1
解决办法
6098
查看次数

如何声明和定义全局变量,以便正确地从所有头文件/源文件访问它们

好吧,我正在学习 C++,从来没有真正学过如何做不是OO的东西.我正试图获得更多C风格编码的经验.

GobalInformation.h

#pragma once

#ifndef GLOBALINFORMATION_H
#define GLOBALINFORMATION_H

#include "MapInformation.h"

namespace gi {
    MapInformation mapInf;
};

#endif
Run Code Online (Sandbox Code Playgroud)

我希望能够从我的项目中的每个头和cpp访问gi :: mapInf.现在我在每个标题中都包含了globalinformation.h,所以我收到了多个定义的链接器错误.

我该如何解决这个问题?

c c++ global-variables

16
推荐指数
2
解决办法
2万
查看次数

多线程如何加速应用程序(当线程无法同时运行时)?

我正在学习多线程,但在阅读了一些教程后,我有点困惑.我不明白多线程如何加速应用程序.

通过直觉,我会说多线程会减慢应用程序的速度,因为你不得不等待那些信号量.

当线程无法同时运行时,多线程如何以及何时可以加速应用程序?

multithreading

12
推荐指数
1
解决办法
6747
查看次数

为什么使用typeid关键字设计不好?

我听过很多人说任何使用typeid都是糟糕的设计,但对我来说似乎它提供了很好的实用性.

  1. 何时(和为什么)使用typeid"糟糕的设计"?
  2. 何时使用typeid可接受?
  3. 如果不可接受,但你仍然需要类似的东西,那么有什么选择可以设计好的?

c++ typeid

10
推荐指数
3
解决办法
6063
查看次数

在哪种情况下,优先选择GDI而不是DirectX/OpenGL是一个好主意

我是图形编程的新手,我想知道为什么我更喜欢GDI而不是DirectX/OpenGL的硬件加速图形?

是否还有充分的理由使用GDI?

opengl directx gdi

9
推荐指数
1
解决办法
3815
查看次数

对象可以被视为变量吗?

我在保持术语类,对象,变量和数据类型方面遇到了一些麻烦.

可以将类视为数据类型吗?一个对象可以被视为变量吗?

另外,技术上有什么区别?

c++

5
推荐指数
2
解决办法
227
查看次数

有没有理由我们能够在类定义中定义[static const int],而不是其他静态const类型?

可能重复:
为什么不允许使用静态const浮点数?

有什么理由说在C++中这是不可能的吗?这让我很困惑.

static const int A = 100; //no error
static const float B = 2.0f; //error, can't define this type in class definition.
Run Code Online (Sandbox Code Playgroud)

c++

5
推荐指数
1
解决办法
161
查看次数

锁,记忆障碍,信号量之间的区别

这篇文章:http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf(第12页)似乎在锁和内存屏障之间有所不同

我想知道锁,内存屏障和信号量之间的区别是什么?

(虽然其他问题可能会提到锁和同步对象之间的区别,但我没有发现锁和内存屏障之间的区别)

c++ multithreading

4
推荐指数
2
解决办法
9956
查看次数