C++ 为什么这些方法使我的程序变得这么大?
我正在编写一些Arduino代码,代码如下:C++ 为什么这些方法使我的程序变得这么大?,c++,c,function,arduino,C++,C,Function,Arduino,我正在编写一些Arduino代码,代码如下: uint8_t world[24][2][3]; bool getDispPixel(uint8_t x, uint8_t y, uint8_t num) { static uint8_t rowByte = 0; // 0 means top 8, 1 means bottom 8 static uint8_t rowBit = 0; if(y > 7) { rowByte = 1;
uint8_t world[24][2][3];
bool getDispPixel(uint8_t x, uint8_t y, uint8_t num)
{
static uint8_t rowByte = 0; // 0 means top 8, 1 means bottom 8
static uint8_t rowBit = 0;
if(y > 7)
{
rowByte = 1;
rowBit = x - 8;
}
else
{
rowByte = 0;
rowBit = x;
}
return (world[x][rowByte][num] & (1 << rowBit)) > 0;
}
void setDispPixel(uint8_t x, uint8_t y, uint8_t num, bool state)
{
static uint8_t rowByte = 0; // 0 means top 8, 1 means bottom 8
static uint8_t rowBit = 0;
if(y > 7)
{
rowByte = 1;
rowBit = x - 8;
}
else
{
rowByte = 0;
rowBit = x;
}
if(state)
world[x][rowByte][num] |= (1 << rowBit);
else
world[x][rowByte][num] &= ~(1 << rowBit);
}
这两种方法都经常被调用,总共调用了200多次。如果它们被标记为内联,我会相信,但它们不是。你知道这是什么原因吗
更新:如果我完全注释掉这些方法的内容,它会将大小减少20k!看起来每个函数调用都会消耗94个字节。不知道为什么…以下是:
nm--打印大小--大小排序--基数=d--demangle GOLClock.cpp.o
(按大小排列的对象大小):
您可以看到函数SetDispPixel
的汇编代码需要148个字节,函数GetDispPixel
94个字节
如果它导致二进制文件大量增加,则可能意味着您的函数正在内联。如果Arduino工具链支持GCC扩展(一些快速搜索表明它支持),那么您可以使用
\uuuu属性(noinline))
禁用这些函数的内联,如下所示:
bool getDispPixel(uint8_t x, uint8_t y, uint8_t num) __attribute__((noinline));
bool getDispPixel(uint8_t x, uint8_t y, uint8_t num)
{
// body of the function here
}
void setDispPixel(uint8_t x, uint8_t y, uint8_t num, bool state) __attribute((noinline));
void setDispPixel(uint8_t x, uint8_t y, uint8_t num, bool state)
{
// body of the function here
}
额外的行看起来多余,但不是。这就是扩展的语法工作原理。您使用的是什么IDE?您能生成一个混合汇编程序/源代码列表吗?常规Arduino IDE。不知道怎么做你用的是哪种操作系统?(对于可用的工具)我从函数中的静态变量开始,它们倾向于生成非平凡的代码,因为编译器必须确保它们只初始化一次。根本不需要。Windows。。。这有什么关系?酷。明白了。这正是我所怀疑的。但是,有没有办法确定为什么会这样,如果是这样,如何停止?有没有办法打印出所有内联的函数?您可以在整个可执行文件上运行相同的命令,而不是在单个对象文件上运行相同的命令,以确定哪些函数内联了。hmmm。。。甚至不知道Arduino的整个可执行文件会在哪里结束。你太棒了。。。这几乎切断了18k字节!现在我只希望我知道为什么它首先要内联它们!:如果编译器正在优化速度,那么内联它们可能是有意义的。Arduino默认为-Os(如果我记得的话,大小)。您不需要额外的行,您可以直接在一行中用函数名声明属性<代码>\uuuu属性((noinline))void setDispPixel(uint8\uTx,uint8\uTy,uint8\uTnum,bool state){…}
bool getDispPixel(uint8_t x, uint8_t y, uint8_t num) __attribute__((noinline));
bool getDispPixel(uint8_t x, uint8_t y, uint8_t num)
{
// body of the function here
}
void setDispPixel(uint8_t x, uint8_t y, uint8_t num, bool state) __attribute((noinline));
void setDispPixel(uint8_t x, uint8_t y, uint8_t num, bool state)
{
// body of the function here
}