- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
“C”中函数 sum 的实现如下:
int sum(int b[], int c)
{
int s,i;
if (c<0)
{
printf("ERROR\n");
}
s = 0;
for(i=0; i<c; ++i)
{
s = s + b[i];
}
return s;
}
我想知道,X86 Linux 平台上的函数 sum 需要多少堆栈和堆(以字节为单位)?如何知道这一点?
从中断处理程序中调用该函数是否可能出现问题或成功?
最佳答案
为了以其他用户已经指出的内容为基础,我将尝试解决OP的这两个问题。
OP的第一个问题:
I'd like to know, How much stack and heap in bytes is required by the function sum in X86 Linux platform? How to know this?
我们可以将第一个问题分为两部分。一个是关于堆栈大小,另一个是关于堆大小。
堆栈大小:
要了解您的函数使用了多少堆栈,您可以使用 GCC 诊断编译指示之一,即 -Wframe-larger-than=<X>
杂注。这是一个关于如何使用它的示例。首先,我们将编译指示添加到代码中并保存文件。
main.cpp
#include <stdio.h>
#pragma GCC diagnostic error "-Wframe-larger-than=1"
int sum(int b[], int c) {
int s,i;
if (c<0) {
printf("ERROR\n");
}
s = 0;
for(i=0; i<c; ++i) {
s = s + b[i];
}
return s;
}
我们现在可以尝试编译代码:
junglefox@ubuntu:~$ gcc -c main.cpp
main.cpp: In function ‘int sum(int*, int)’:
main.cpp:20:1: error: the frame size of 32 bytes is larger than 1 bytes [-Werror=frame-larger-than=]
}
^
cc1plus: some warnings being treated as errors
junglefox@ubuntu:~$
报告的大小为32 字节。
stack-usage
GCC 中的编译器标志。因此,我们删除或注释掉 // #pragma GCC diagnostic error "-Wframe-larger-than=1"
行并尝试再次编译该文件,如下所示。 junglefox@ubuntu:~$ gcc -c main.cpp -fstack-usage
这将生成一个文件main.su
.
junglefox@ubuntu:~$ cat main.su
main.cpp:5:5:int sum(int*, int) 48 static
这显然表明我们正在使用 48 字节 的堆栈。
<小时/>堆大小
要了解我们的程序使用了多少堆大小,我们将使用 valgrind
工具Massif
。为此,我们首先需要在代码中添加一个 main() 函数(没有它我们无法创建二进制文件。而二进制文件就是我们需要使用 valgrind 运行的)。所以main.cpp
,现在看起来像这样,
#include <stdio.h>
// #pragma GCC diagnostic error "-Wframe-larger-than=1"
int sum(int b[], int c) {
int s,i;
if (c<0) {
printf("ERROR\n");
}
s = 0;
for(i=0; i<c; ++i) {
s = s + b[i];
}
return s;
}
int main() {
// As Peter pointed, uncomment one of the following lines,
// for it to be a valid test. Also, compiler optimizations,
// when turned on, can give different results.
// sum(NULL,0);
// sum(NULL,-1);
return 0;
}
现在我们将在 valgrind 的帮助下编译、构建和运行二进制文件,如下所示:
junglefox@ubuntu:~$ gcc -o main main.cpp
junglefox@ubuntu:~$ valgrind ./main --tool=massif
这将生成一堆信息,如下所示:
==8179== Memcheck, a memory error detector
==8179== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==8179== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==8179== Command: ./main --tool=massif
==8179==
==8179==
==8179== HEAP SUMMARY:
==8179== in use at exit: 0 bytes in 0 blocks
==8179== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==8179==
==8179== All heap blocks were freed -- no leaks are possible
==8179==
==8179== For counts of detected and suppressed errors, rerun with: -v
==8179== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
报告堆使用总量为 0 KB。
此外,正如 @mevets 试图解释的那样,您始终可以查看编译器生成的底层汇编代码。在海湾合作委员会,你可以这样做,
junglefox@ubuntu:~/gcc -S main.cpp
junglefox@ubuntu:~/cat main.s
这将向您展示您的函数在底层汇编输出中的样子。
注意/编辑:但为了完整起见,在 C 或 C++ 中,没有使用 malloc()
进行动态内存分配。或new
,作为程序员,您没有使用堆。另外,除非您在函数内声明数组,否则您不会使用任何大量的堆栈。
OP的第二个问题:
Is invocation of the function from within an interrupt-handler likely to be problematic or successful?
正如许多人在评论中善意指出的那样,请勿使用 printf()
在您的中断处理程序中。
引用此link :
What differentiates interrupt handlers from other kernel functions is that the kernel invokes them in response to interrupts and that they run in a special context called interrupt context. This special context is occasionally called atomic context because code executing in this context is unable to block.
Because an interrupt can occur at any time, an interrupt handler can be executed at any time. It is imperative that the handler runs quickly, to resume execution of the interrupted code as soon as possible.
所以,除了 printf()
,可能需要很长时间的一件事是,当用作 Interrupt Service Routine
时,传递给该函数的数组有多大。 。它的复杂度为O(n)
。如果c
太大,您的程序将暂停相对较长的时间,直到 ISR 完成 for()
循环。
关于c - X86 中的 C 函数需要多少堆栈和堆(以字节为单位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54001978/
我有 2 张 table ; item_in(item_id,unit) item_out(item_id,unit) 现在假设我想知道为每个项目插入了多少个单元,我只是查询 select sum(u
API 浏览器中有 3 个速率限制类别: 如果我使用 Youtube 数据 API(其中跟随 implicit OAuth grant flow)创建客户端 Web 应用程序,我是否仍被限制为总共 1
我正在使用一个 postgresql 表,该表包含许多带有 GEOMETRY(Point, 4326) 的行。使用 ST_SnapToGrid 函数和 DISTINCT 选择,我只根据显示的 map
我对 C++ 和 Cppunit 都很陌生。我正在尝试编译一个小的 cppunit 测试。但是,我没有成功。 qwerty@qwerty:~/chessgame/src$ g++ -Wall Coor
我注意到 REM 单位可用于元素的大小,而不仅仅是字体大小。并且对 HTML 字体大小属性非常有用。 html { font-size:1vw } @media all and (max-width:
我试图在 Shapely 中找到线串的长度(以米为单位),但似乎无法达到预期的结果。几乎可以肯定我在坐标系方面犯了一些错误,但我无法弄清楚。 这是单行的一些简化代码: from shapely.geo
对于大量的物种数据集,我试图计算给定月份集的圆形平均值,例如对于从 3 月到 7 月开花的物种,我想知道开花的平均月份(即 5 月),以及围绕平均值的方差。 给定月份是循环的,因此 12 月到 2 月
我还应该在单元测试中释放对象吗? 我注意到在Apple的“iPhoneUnitTests”示例项目中,设置方法中的对象是[[object alloc] init],但从未在单元测试中的任何地方发布?
我目前正在使用 OpenGL 进行开发,并使用米作为我自己的单位,即 20 厘米宽的三角形为 0.2。然而 OpenGL 似乎对这些数字进行了舍入,最终的形状并不完全符合我的意愿。这在 OpenGL
我的问题与对信号进行频谱分析或将信号放入 FFT 并使用合适的数值包解释结果的物理意义有关, 具体: 获取一个信号,例如时变电压 v(t) 将其放入 FFT 中(您将得到复数序列) 现在取模 (abs
在深入研究代码后,我意识到 Fabricjs Text 对象的 fontSize 是在 PIXELS 中测量的。在我的项目中,有时我需要使用点而不是像素。 当指定单位时,我只在代码中找到一个位置,此片
在我的应用程序中,我尝试使用,RentModel.find({prop_location : { $near : [msg.lat, msg.lng],$maxDistance : 500}},函数(
我正在开发我的第一个 LibGdx (Scene2d + Box2d) 游戏,这对我来说是一个全新的领域,但仍然对一些事情感到有点困惑,尤其是关于单位。已经看到了几种不同的处理方法,但仍然不确定哪种方
我正在寻找一个 MySQL 查询(子查询很好),它将以下列格式获取过去一年中每个订单的单位分布: units_per_order | number_of_orders |
我正在使用 Highcharts生成折线图。 我遇到了 numberFormat 的问题: var test = 15975000; numberFormat(test, 0,',','.'); 结果
我正在尝试创建一些用户定义的类型来表示单位,以便我可以强类型化函数参数。例如,长度为毫米,速度为毫米每秒,加速度为毫米每秒等。 到目前为止我已经这样做了: template struct Value
谁能解释一下最低精度的 ULP 单位?我有如下定义,但还是不清楚 “表示分数时的误差大小与存储的数字大小成正比。ULP 或最小精度单位定义了存储数字时可以获得的最大误差。存储的数字越大,ULP 越大”
我有一张卡片图像,我需要重复它 30 次,每次我想申请一张特定卡片的左侧位置时,它会与卡片重叠,然后再停留在一副牌的位置上。 问题是,当我将左侧位置应用于图像卡片时,它会将相同的左侧位置应用于所有卡片
有没有办法用php代码更改每个滚动条的大小。 说明:当我向下滚动时,它会下降x(50~)像素,我想将x改为20。 编辑:这是我的代码。。。 Excel "; $i=1; wh
我不知道下面的想法是否可行或不能概括它,但我想将每个计算值四舍五入到 100 单位四舍五入。 例子: double x; int x_final; ... if (x<400) x_final=400
我是一名优秀的程序员,十分优秀!