【问题标题】:Automatic code generation in C++C++ 中的自动代码生成
【发布时间】:2011-07-14 13:14:02
【问题描述】:

我想要一段不涉及循环但会自动生成一些 C++ 代码的代码。

我有一个const int d,我想从中编写 d 行代码来访问一个数组。比如

for(int k=0; k<d;++k){
  // do something to myarryay[k];
}

但我不想在 for 循环中写这个。我希望编译器像以下代码行一样执行:

do something to myarray[0]
do something to myarray[1]
.
.
.
do something to myarray[d]

谁能给我一些关于这样做的代码的建议?

提前致谢。

【问题讨论】:

  • 你只是想重复输出一些文本到一个文件中,每次都改变数字,不是吗?在任何能够将文本写入文件的语言中,这听起来都是一项非常简单的编程任务。

标签: c++ code-generation


【解决方案1】:

您确定需要手动执行此操作吗?这是一种称为loop unrolling 的优化。在足够高的优化级别上,您的编译器会为您做这件事,并且可能比您做得更好,因为一个好的优化编译器会考虑到权衡(例如减少指令缓存局部性)。

【讨论】:

    【解决方案2】:

    您应该很少需要手动展开循环(我会说永远不会,但是如果您正在处理具有疯狂性能要求的事情并且您认为可以单独使用编译器优化器,那么也许您可以手动展开循环)。

    如果您出于某种原因确实需要这样做,在预处理器的帮助下非常简单:

    #include <boost/preprocessor.hpp>
    
    #include <iostream>
    
    void f(int x) { std::cout << x << std::endl; }
    
    int main()
    {
        #define MYARRAY_COUNT 10
        int myarray[MYARRAY_COUNT] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    
        #define GENERATE_ELEMENT_CASE(z, n, data) f(myarray[n]);
    
        BOOST_PP_REPEAT(MYARRAY_COUNT, GENERATE_ELEMENT_CASE, x)
    
        #undef GENERATE_ELEMENT_CASE
        #undef MYARRAY_COUNT
    }
    

    扩展后的main() 函数如下所示:

    int main()
    {
        int myarray[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    
        f(myarray[0]); f(myarray[1]); f(myarray[2]); f(myarray[3]); f(myarray[4]);
        f(myarray[5]); f(myarray[6]); f(myarray[7]); f(myarray[8]); f(myarray[9]);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 1970-01-01
      • 2014-07-17
      • 2016-09-23
      • 2010-10-04
      • 1970-01-01
      • 2019-10-19
      • 2011-09-06
      • 2015-04-19
      相关资源
      最近更新 更多