我有一个D模块,我希望它包含公共和私人部分。在函数定义之前,我尝试过使用关键字私有和静态。我有一个功能,我希望使外部可调用/公开,理想情况下,我希望它是内联的呼叫网站。此函数调用其他模块--打算是私有的内部函数,即不可外部调用的函数。对这些调用成功地内联在模块中,许多cruft被CTFE和已知的常量传播处理。然而,GDC编译器也会生成这些内部例程的副本,即使它们已经在需要的地方内联,而且它们不应该是外部调用的。我正在与-O3 -frelease一起编译。我应该做什么--即使我使用静态和/或私有的,我也应该期望这样做吗?
我还简要地看了一下这个thread concerning GCC,希望能有所了解。
正如我前面提到的,我尝试过在这些内部函数上使用私有函数和静态函数,但我似乎无法抑制代码生成。如果调试器需要有这些例程的副本来设置断点,我可以理解这一点。我需要强调的是,据我所知,也许可以在链接时间解决这个问题。我还没有试着链接这个程序,我只是看看使用GDC在马特戈德波特D编译器资源管理器中生成的代码。所有东西都可以用模板参数的零长度列表(例如auto my_fn( ) (在arg_t x中))制作成模板,尝试过,它没有帮助,但没有害处。
还有几件事要做:我可以尝试用私有部件创建一个静态类,作为实现包的一种方式,Ada风格。(需要严格做到单实例。)我从未做过任何C++,专业上只做了大量的asm和C。所以这将是一个学习曲线。
我唯一能想到的另一件事是使用嵌套函数定义,Pascal/Ada风格,将内部例程移动到调用者的体内。但这有很多缺点。
粗例
module junk;
auto my_public_fn() { return my_private_fn(); }
private
static // 'static' and/or 'private', tried both
auto my_private_fn() { xxx ; return whatever; }发布于 2017-03-02 19:41:37
我刚刚与Iain进行了简短的讨论,实现这一点并不像看起来那么简单。
首先,static在D中有许多含义,但翻译单位局部函数的C意义不是其中之一;)
因此,将这些函数标记为private似乎是直观的。毕竟,如果您不能从翻译单元外部访问一个函数,并且您从未泄漏到该函数的地址,为什么不删除它呢?在这种情况下,它可以是完全未使用的,也可以是内联到所有调用者中的。
下面是一个问题:我们无法确定某个函数是否未使用:
private void fooPrivate() {}
/*template*/ void fooPublic()()
{
fooPrivate();
}在编译文件时,GDC对fooPublic模板一无所知(因为只有在实例化时才能对模板进行充分分析),因此fooPrivate似乎是未使用的。稍后在不同的文件中使用fooPublic时,GDC将依赖于已经在原始源中发出的fooPrivate &毕竟,它不是一个模板,因此不会被发送到新模块中。
可能会有解决办法,但整个问题似乎并不简单。我们还可以为此引入一个自定义的gcc.attribute属性。它会对模板造成同样的问题,但是由于它是对一个usecase (不像private)的一个特定注释,我们可以依赖用户来做正确的事情。
https://stackoverflow.com/questions/42494205
复制相似问题