Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这些方法使我的程序变得这么大?_C++_C_Function_Arduino - Fatal编程技术网

C++ 为什么这些方法使我的程序变得这么大?

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;

我正在编写一些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;
        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
}