标签: compile-time

在编译时,`auto`说明符是否较慢?

从C++ 11开始,我们可以使用auto a = 1+2而不是int a = 1+2编译器,并且编译器会a自行推断出类型.它是如何工作的?编译时(更多操作)比自己声明类型更慢吗?

c++ types compile-time auto c++11

11
推荐指数
3
解决办法
2101
查看次数

理解 Raku 的 `&?BLOCK` 编译时变量

我真的很欣赏 Raku 的&?BLOCK变量——它让你在一个未命名的块内递归,这可能非常强大。例如,这是一个简单的内联匿名阶乘函数:

{ when $_ ? 1 { 1 }; 
  $_ × &?BLOCK($_ - 1) }(5) # OUTPUT: «120»
Run Code Online (Sandbox Code Playgroud)

但是,在更复杂的情况下使用时,我对它有一些疑问。考虑这个代码:

{   say "Part 1:";
    my $a = 1;
    print '    var one: '; dd $a;
    print '  block one: '; dd &?BLOCK ;
    {
        my $a = 2;
        print '    var two: '; dd $a;
        print '  outer var: '; dd $OUTER::a;

        print '  block two: '; dd &?BLOCK;
        print "outer block: "; dd &?OUTER::BLOCK …
Run Code Online (Sandbox Code Playgroud)

metaprogramming rakudo compile-time raku

11
推荐指数
2
解决办法
128
查看次数

通过自由函数或成员函数扩展的机制

包含标准的大量C++库允许您调整对象以便在库中使用.选择通常在成员函数或同一名称空间中的自由函数之间.

我想知道函数和构造库代码用于调用一个调用这个"扩展"函数之一的调用,我知道这个决定必须在编译期间进行,并涉及模板.以下运行时伪代码不可能/无意义,原因超出了本问题的范围.

if Class A has member function with signature FunctionSignature
    choose &A.functionSignature(...)
else if NamespaceOfClassA has free function freeFunctionSignature
    choose freeFunctionSignature(...)
else
    throw "no valid extension function was provided"
Run Code Online (Sandbox Code Playgroud)

上面的代码看起来像运行时代码:/.那么,库如何找出一个类所在的命名空间,它如何检测这三个条件,还有哪些需要避免的陷阱.

我的问题的动机是让我能够在库中找到调度块,并能够在我自己的代码中使用这些构造.所以,详细的答案将有所帮助.

!!赢得胜利!

好的,根据Steve(和评论)的答案,ADL和SFINAE是在编译时连接调度的关键结构.我的头部是ADL(原始)和SFINAE(再次是粗鲁的).但我不知道他们是如何以我认为应该的方式共同组织的.

我想看一个如何将这两个结构组合在一起的说明性示例,以便库可以在编译时选择是在对象中调用用户提供的成员函数,还是在同一对象的命名空间中提供的用户提供的自由函数.这应该只使用上面的两个构造来完成,没有任何类型的运行时分派.

让我们说有问题的对象被调用NS::Car,并且这个对象需要提供MoveForward(int units)作为c的成员函数的行为.如果要从对象的命名空间中拾取行为,它可能看起来像MoveForward(const Car & car_, int units).让我们定义想要分派的函数mover(NS::direction d, const NS::vehicle & v_),其中direction是一个枚举,而v_是一个基类NS::car.

c++ oop templates library-design compile-time

10
推荐指数
2
解决办法
496
查看次数

如何在D中使用"模板构造器"?

D模板文档包含一个名为"模板构造函数"的小部分.该部分没有任何示例或大量文档.

我正在尝试使用该功能(我知道我可以使用"静态构造函数",但我有理由更喜欢模板构造函数).

特别是,我试图在编译时生成一些哈希值.这是我的尝试:

struct MyHash
{
    uint value;

    this(uint value)
    {
        this.value = value;
    }

    this(string str)()
    {
        enum h = myHashFunc(str);
        return MyHash(h);
    }
}

uint myHashFunc(string s)
{
    // Hashing implementation
    return 0;
}

int main(string[] str)
{
    MyHash x = MyHash!"helloworld";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这不能用DMD 2.053编译:

x.d(10): Error: template x.MyHash.__ctor(string str) conflicts with constructor x.MyHash.this at x.d(5)
Run Code Online (Sandbox Code Playgroud)

它抱怨第一个构造函数.删除后:

x.d(20): Error: template instance MyHash is not a template declaration, it is a struct
Run Code Online (Sandbox Code Playgroud)

考虑到我使用的语法与MyHash是模板结构相同,这是非常合乎逻辑的.

那么,有谁知道如何声明并调用"模板构造函数"?

templates d compile-time dmd

10
推荐指数
1
解决办法
549
查看次数

如何在编译时检查`typeof`是否为void值?

让我们说我希望C macro适用于任何类型.我正在使用GCC编译器(> = 4.6)并且可以使用GNU99宏.

//code...
any_type_t *retVal = function_that_runs_very_long_time(a, b, &&c, **d, &e, *f);
//other code...
Run Code Online (Sandbox Code Playgroud)

用于TIMER的宏的用法可以看起来像这样

//code...
any_type_t *retVal = 
    TIMER(
          function_that_runs_very_long_time(a, b, &&c, **d, &e, *f),
          "TIMING FOR VALUE <%d, %d>", a, b
         );
//other code...
Run Code Online (Sandbox Code Playgroud)

因此TIMER必须返回给定函数的值和其运行的打印持续时间.具有void返回类型的函数存在问题.

我显然可以有两个宏,如TIMER_TYPE和TIMER_VOID,但我想使用单一的时间函数与任何返回值.

谢谢你的建议.


编辑此TIMER宏的示例

#define TIMER(expr, fmt_msg, ...)                           \
({                                                          \
    struct timeval before, after;                           \
    uint64_t time_span;                                     \
    int time_span_sec, time_span_usec;                      \
    gettimeofday(&before, NULL);                            \
    typeof(expr) _timer_expr__ = (expr);                    \ // <- static if?
    gettimeofday(&after, NULL);                             \
    time_span = …
Run Code Online (Sandbox Code Playgroud)

c types void compile-time c-preprocessor

10
推荐指数
1
解决办法
1847
查看次数

为什么不允许'constexpr'参数?

使用'constexpr'参数以区分编译器已知值并因此能够在编译时检测错误将是有用的.例子:

int do_something(constexpr int x)
{
  static_assert(x > 0, "x must be > 0");
  return x + 5;
}

int do_something(int x)
{
  if(x > 0) { cout << "x must be > 0" << endl; exit(-1); }
  return x + 5;
}

int var;

do_something(9); //instance 'do_something(constexpr int x)' and check arg validity at compile-time

do_something(0); //produces compiler-error

do_something(var); //instance 'do_something(int x)'
Run Code Online (Sandbox Code Playgroud)

这是目前无效的代码.有人可以解释一下为什么这不能实现吗?

编辑:

使用模板用户应该确保文字总是作为模板参数传递,而不是作为非常不舒服的函数传递:

template<int x>
int do_something()
{
  static_assert(x > 0, "x must be > 0");
  return …
Run Code Online (Sandbox Code Playgroud)

c++ compile-time language-lawyer c++14

10
推荐指数
2
解决办法
1006
查看次数

Flutter:使构建时环境变量可用于代码

如何让构建时环境变量可用于 Flutter 应用程序中的代码?(我的具体用例是注入应用程序版本号并将哈希提交到调试屏幕中。此信息在构建时可用,但在运行时不可用)。

我曾希望能够做这样的事情:

flutter run --dart-define=APP_VERSION=0.1.2

进而,

const appVersion = String.fromEnvironment('APP_VERSION', defaultValue: 'development');

但这似乎不起作用(我使用的是 Flutter 1.12.13+hotfix.5),而且我不确定 Flutter 是否支持该功能。

environment-variables compile-time flutter

10
推荐指数
2
解决办法
6376
查看次数

从特性控制移相器

是否可以CONTROL从特征中添加移相器?

按照docs 中示例,在运行时代码中添加自定义控件异常很简单:

class CX::Oops does X::Control {};
sub f { CONTROL { when CX::Oops { note 'Oops!'; .resume}}
        CX::Oops.new.throw;  }

f; # OUTPUT: «Oops»
Run Code Online (Sandbox Code Playgroud)

但是,我尝试从特征中这样做并没有奏效:

sub trait_mod:<is>(Sub $fn, :$oopsable) {
    $fn.add_phaser: 'CONTROL', { when CX::Oops { note 'Oops!'; .resume} }}

sub g is oopsable { CX::Oops.new.throw; }
g; # OUTPUT: «control exception without handler»
Run Code Online (Sandbox Code Playgroud)

.has_phasersfire_phasers(有趣的名字!)方法,我可以看出这添加控制移相器。我需要做些什么来将其注册为处理程序,还是我还缺少其他东西?

exception rakudo compile-time raku

10
推荐指数
1
解决办法
116
查看次数

What is the _intended_ value of &amp;?ROUTINE?

The Rakudo implementation of Raku tracks multiple issues about the (very useful!) &?ROUTINE variable not providing the correct value (e.g., #1768 and 2362), so I realize that it's not behaving quite correctly. But I'm trying to understand what it's intended behavior is – which seems like an essential first step in fixing that behavior.

Running this code with Rakudo v2021.06 produces the output noted in the comments. Which parts of this output are correct, and which represent bugs?

sub …
Run Code Online (Sandbox Code Playgroud)

rakudo compile-time raku

10
推荐指数
2
解决办法
131
查看次数

什么是“外部字符条件技巧”?

我正在阅读有关 C 和 C++ 函数属性的 GCC 文档error在和属性的描述中warning,文档不经意地提到了以下“技巧”:

error ("message")
warning ("message")

如果在函数声明上使用errororwarning属性,并且没有通过死代码消除或其他优化来消除对此类函数的调用,则会诊断出包含消息的错误或警告(分别)。这对于编译时检查很有用,特别是与__builtin_constant_p内联函数一起使用时,通过技巧无法检查内联函数参数extern char [(condition) ? 1 : -1];

虽然可以使函数未定义,从而调用链接失败(在.gnu.warning*节中使用消息定义函数),但使用这些属性时,即使存在内联函数或存在内联函数或调用的确切位置,也可以更早地诊断出问题。当不发出调试信息时。

没有进一步的解释。也许对于沉浸在环境中的程序员来说这是显而易见的,但对我来说却一点也不明显,而且我在网上找不到任何解释。这项技术是什么?我什么时候可以使用它?

c c++ gcc compile-time

10
推荐指数
1
解决办法
288
查看次数