相关疑难解决方法(0)

哪个更快:堆栈分配或堆分配

这个问题可能听起来相当简单,但这是我与另一位与我合作的开发人员的辩论.

我正在小心处理堆栈分配的东西,而不是堆分配它们.他正在跟我说话,看着我的肩膀并评论说这没有必要,因为他们的表现是明智的.

我一直认为堆栈的增长是恒定的时间,并且堆分配的性能取决于堆的当前复杂性(用于找到合适大小的孔)和解除分配(折叠孔以减少碎片,如如果我没有弄错的话,许多标准库实现在删除期间需要时间来完成此操作.

这让我觉得可能非常依赖于编译器.特别是对于这个项目,我使用Metrowerks编译器来实现PPC架构.对这种组合的洞察力将是最有帮助的,但总的来说,对于GCC和MSVC++,情况如何?堆分配不如堆栈分配高吗?没有区别吗?或者差异是如此微小,它变得毫无意义的微优化.

c++ memory heap performance stack

489
推荐指数
13
解决办法
12万
查看次数

42
推荐指数
1
解决办法
4万
查看次数

如何使用宏在C++中生成随机变量名?

我正在用C++创建一个宏来声明一个变量并为它赋值.根据宏的使用方式,宏的第二次出现可以覆盖第一个变量的值.例如:

#define MY_MACRO int my_variable_[random-number-here] = getCurrentTime();
Run Code Online (Sandbox Code Playgroud)

使用它的另一个动机是避免为变量选择某个名称,以使其与开发人员最终使用宏选择的名称相同.

有没有办法在C++中的宏内生成随机变量名?

- 编辑 -

我的意思是独特但也是随机的,一旦我可以在一个块中使用我的宏两次,在这种情况下,它将生成如下:

int unique_variable_name;
...
int unique_variable_name;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,为了唯一,必须随机生成两个变量名.

c++ random variables macros naming

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

如何将程序执行跳转到C中的特定地址?

我希望程序跳转到内存中的特定地址并继续从该地址执行.我考虑过使用,goto但我没有标签而只是内存中的地址.

无需担心从跳转地址返回.

编辑:使用GCC编译器

c c++

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

Cygwin:汇编语言开发?

首先,我不确定这应该是我昨天在汇编和堆栈上开始的线程的一部分,但我认为我在这里问的问题是完全不同的.

我一直试图通过维基百科和谷歌了解Cygwin到底是什么,我运气不错.我刚刚开始使用gcc气体汇编程序在Linux上进行汇编编程.我正在午餐时使用一台机器,上面只有Windows.我想在这里练习一些汇编语言编程,所以我认为Cygwin可以提供帮助.

我错误地认为我在Linux中编写的代码可以使用Cygwin在Windows中编译和运行.Cygwin允许我编译代码:

as someAssmProg.as -o someAssmProg.o
ld someAssmProg.o -o someAssmProg
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试在Cygwin下运行代码,

./someAssmProg
Run Code Online (Sandbox Code Playgroud)

我收到"未处理的win32异常发生"消息

现在我假设这是因为我写的代码是针对Linux的.我想虽然Cygwin会处理这件事.Cygwin是否真的用于以Unix风格的命令行方式开发Windows应用程序?

我再次知道这对大多数人来说可能是显而易见的,但我真的很困惑!

PS我之前尝试过AndLinux用于Windows,但这是一个非常大的安装.

assembly cygwin

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

为什么将变量`i`初始化为0和大尺寸会导致程序的大小相同?

有一个问题让我很困惑.

int main(int argc, char *argv[])
{
    int i = 12345678;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
int main(int argc, char *argv[])
{
    int i = 0;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

尺寸

程序总共具有相同的字节.为什么?

那个字面值确实存储在哪里?文字段或其他地方?

记忆图

c variables size

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

了解cmp指令

我对装配很新,现在我想了解它的cmp工作原理.以下是wiki中的内容:

cmp arg2, arg1
Run Code Online (Sandbox Code Playgroud)

在arg1和arg2之间执行比较操作.通过从arg1中减去arg2的(带符号)来执行比较,其结果可以称为Temp.然后丢弃温度.

什么意思"然后丢弃温度"?它存放在哪里?如何访问此比较结果?有人可以解释一下吗?

comparison x86 assembly

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

令牌粘贴和__LINE__

我正在编写一个简单的宏来显示TRACE信息.

这就是我正在使用的,

#ifdef __DEBUG__
#define TRACE  { PrintErrorMsg("Trace exception at " __FILE__  "LineNo:"##(__LINE__) "Function: " __FUNCTION__ " " );}
#else 
#define TRACE 
#endif
Run Code Online (Sandbox Code Playgroud)

这与FILE一起使用,但它似乎不适用于LINE,任何想法我怎么能处理这个.我已经尝试过使用字符串操作符.这是如下所示.

#ifdef __DEBUG__
#define TRACE  { PrintErrorMsg("Trace exception at " __FILE__  "LineNo:"#(__LINE__) "Function: " __FUNCTION__ " " );}
#else 
#define TRACE 
#endif
Run Code Online (Sandbox Code Playgroud)

没有parms和双parms,前 - __LINE__((__LINE__)) 任何想法我怎么能处理这个问题?

我想出来了,

#ifdef __DEBUG__
#define ERROR_MSG_BUF_SIZE 1024
#define TRACE  { char * error_msg_buffer = new char[ERROR_MSG_BUF_SIZE]; \
                 sprintf(error_msg_buffer,"Trace Exception at file: %s ,Line : %d , …
Run Code Online (Sandbox Code Playgroud)

c++ macros file

3
推荐指数
2
解决办法
2373
查看次数

C++:函数变量声明,它在内部如何工作?

这一直困扰着我很长一段时间:让我说我有一个功能:

void test(){
    int t1, t2, t3;
    int t4 = 0;
    int bigvar[10000];
    // do something
}
Run Code Online (Sandbox Code Playgroud)

计算机如何处理变量的内存分配?

我一直认为变量空间保存在计算机将读取的.exe中,这是正确的吗?但据我所知,该bigvar数组不会占用int.exe中的10000个元素空间,因为它未初始化.那么当我调用函数时,它的内存分配如何工作?

c++ windows stack visual-studio-2008

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

为什么push指令会改变rsp的值?

我正在检查 Ericksons Hacking: The Art of Exploitation 中的这段代码片段:

\n
void test_function(int a, int b, int c, int d) {\n        int flag;\n        char buffer[10];\n        flag = 31337;\n        buffer[0] = \'A\';\n}\n\nint main() {\n        test_function(1, 2, 3, 4); \n}\n
Run Code Online (Sandbox Code Playgroud)\n
void test_function(int a, int b, int c, int d) {\n        int flag;\n        char buffer[10];\n        flag = 31337;\n        buffer[0] = \'A\';\n}\n\nint main() {\n        test_function(1, 2, 3, 4); \n}\n
Run Code Online (Sandbox Code Playgroud)\n

我在 main 和 test_function 处设置了断点。\n当中断 main 时,我得到以下输出:

\n
gcc -g stack_example.c\n\ngdb -q ./a.out\n\ngef\xe2\x9e\xa4list main\n\n\n     0x555555555192 …
Run Code Online (Sandbox Code Playgroud)

c assembly x86-64

0
推荐指数
1
解决办法
4108
查看次数

x86 处理器可以调用多少个子例程?

我正在编写一个小程序,用 printf("\219") 打印一个多边形,看看我正在做的事情是否适合我的内核。但它需要调用很多函数,我不知道x86处理器是否可以接受那么多子例程,而且我在google中找不到结果。所以我的问题是它是否会接受这么多函数调用以及最大值是多少。(我的意思是这样的:-)

function a() {b();}
function b() {c();}
function c() {d();}
...
Run Code Online (Sandbox Code Playgroud)

我已经使用了 5 个这样的级别(你知道我的意思,对吧?)

c++ stack-overflow x86 gcc callstack

0
推荐指数
1
解决办法
357
查看次数