标签: code-generation

使用模板函数生成的代码与普通函数之间的差异

我有一个包含大量元素的向量.现在我想编写一个小函数来计算向量中偶数或奇数元素的数量.由于性能是一个主要问题,我不想在循环中放入if语句.所以我写了两个小函数,如:

long long countOdd(const std::vector<int>& v)
{
    long long count = 0;
    const int size = v.size();
    for(int i = 0; i < size; ++i)
    {
        if(v[i] & 1)
        {
            ++count;
        }
    }
    return count;
}

long long countEven(const std::vector<int>& v)
{
    long long count = 0;
    const int size = v.size();
    for(int i = 0; i < size; ++i)
    {
         if(0 == (v[i] & 1))
        {
            ++count;
        }
    }
    return count;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我可以通过编写这样的单个模板函数来获得相同的结果:

template <bool countEven>
long long countTemplate(const …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction templates code-generation

3
推荐指数
2
解决办法
740
查看次数

使用实用程序生成Java代码,使我的项目更简洁.好主意?

我正在进行的项目要求我编写大量重复的代码.例如,如果我想在我的代码中加载一个名为"logo.png"的图像文件,我会写这样的东西:Bitmap logoImage;

...
// Init
logoImage = load("logo.png")

...
// Usage
logoImage.draw(0, 0);

..
// Cleanup
logoImage.release();
Run Code Online (Sandbox Code Playgroud)

必须编写此代码以使用每个新图像是一件痛苦的事情,包括必须指定logoImage应该加载文件"logo.png".

由于我正在开发一个Java Android游戏并且图像在内部循环中被大量使用,我真的想避免做出虚拟函数调用这样的慢速事情,例如当我可以避免它时访问数组/地图/对象字段.从Android API(生成的R类)复制一个想法,我想我可以在编译之前运行一个实用程序来为我生成一些重复的代码.例如,项目文件中的实际代码将简化为:

logoImage.draw(0, 0);
Run Code Online (Sandbox Code Playgroud)

使用一些命令行工具(例如grep,sed),我可以查找"Image.draw(..."的每个实例,然后自动生成其他所需的代码,即加载/释放文件的代码.png并声明"位图logoImage"某处.此代码可以添加到新类中,也可以在我的代码中添加占位符,告诉代码生成器在哪里插入生成的代码.

要显示新图像,我需要做的只是将图像文件复制到正确的目录并添加一行代码.很好,很简单.这避免了创建图像数组,定义标记的int常量以引用数组以及必须指定要加载的文件名等方法.

这是一个非常糟糕的主意吗?这看起来有点像黑客,但我看不到更简单的方法,它似乎彻底清理我的代码.是否有任何标准工具可用于执行此类简单的代码生成(即该工具不需要了解代码的含义)?还有其他人做这样的事情来弥补语言功能吗?

java android code-generation

3
推荐指数
1
解决办法
406
查看次数

如何保持无法访问的代码?

我想编写一个函数,根据用户设置,可以执行或不执行某些可选代码.该函数是cpu密集型的,并且if中的ifs会很慢,因为分支预测器不是那么好.

我的想法是在函数的内存中复制并在我不想执行某些代码时用跳转替换NOP.我的工作示例如下:

int Test()
{
    int x = 2;
    for (int i=0 ; i<10 ; i++)
    {
        x *= 2;

        __asm {NOP}; // to skip it replace this
        __asm {NOP}; // by JMP 2 (after the goto)
            x *= 2; // Op to skip or not

        x *= 2;
    }
    return x;
}
Run Code Online (Sandbox Code Playgroud)

在我的测试主程序中,我将此函数复制到新分配的可执行内存中,并用JMP 2替换NOP,以便不执行以下x*= 2.JMP 2实际上是"跳过接下来的2个字节".

问题是每次编辑要跳过的代码并更改其大小时,我都必须更改JMP操作数.

解决这个问题的另一种方法是:

__asm {NOP}; // to skip it replace this
__asm {NOP}; // by JMP 2 (after the goto)
goto dont_do_it;
    x *= …
Run Code Online (Sandbox Code Playgroud)

c++ assembly code-generation dead-code

3
推荐指数
1
解决办法
1355
查看次数

在com.sun.codemodel中使用泛型

使用com.sun.codemodel,我想生成一个通用的LinkedList字段.我可以使用以下代码创建一个原始字段:

JDefinedClass masterClass;
String detailName;
JDefinedClass detailClass;
JFieldVar detailField = masterClass.field(JMod.PRIVATE, LinkedList.class, detailName);
Run Code Online (Sandbox Code Playgroud)

但是我找不到用通用类型创建LinkedList的方法detailClass.

java code-generation sun-codemodel

3
推荐指数
1
解决办法
2710
查看次数

Objective C的代码生成器

我一直在使用CodeSmith从DB生成.NET代码.SQLite DB是否有类似的代码生成工具,它为objective-c生成代码?

sqlite code-generation objective-c

3
推荐指数
1
解决办法
2309
查看次数

Netbeans代码难题:如何编辑自动生成的代码?

好.所以这是一个netbeans问题,这要归功于GUI设计器自动生成的代码.我使用netbeans UI设计器设计了一个GUI,它是为java 1.6编译的.在我完成UI后,我意识到我应该为Java 1.4而不是1.6执行此操作.在从1.6降级到1.4的努力中,我改变了表单属性以使用Swing Extensions Library,我在代码中摆脱了增强的forloop和泛型,我对此最终错误感到困惑:

类org.jdesktop.application.ResourceMap中的错误方法getString不能应用于给定的类型; required:java.lang.String,java.lang.Object [] found:java.lang.String reason:actual和formal参数列表的长度不同

这来自Netbeans自动生成的代码块,用于此方法调用:

resourceMap.getString("panel.tabTitle");
Run Code Online (Sandbox Code Playgroud)

显然,这可能通过写这个来解决:

resourceMap.getString("panel.tabTitle",new Object{String.class});
Run Code Online (Sandbox Code Playgroud)

但是,我对如何使netbeans对它生成的代码进行更改感到难过!如果您之前已经看过这个问题并且能够解决它,请告诉我.感谢您的帮助.

java netbeans code-generation

3
推荐指数
1
解决办法
1万
查看次数

在Visual C++中生成极其怪异的代码,几乎完全相同的代码; 3倍速差

下面的代码(从我的大代码中减去,在我惊讶于它的速度如何与之相比之后std::vector)有两个特殊的特征:

  • 当我对源代码进行非常小的修改时,它运行速度提高了三倍以上(总是用Visual C++ 2010 编译它)./O2

    注意:为了使这更有趣,我在最后给出了修改的提示,这样你就可以花一些时间自己搞清楚这个改变.原始代码大约是500行,所以我花了很长时间才把它固定下来,因为修复看起来与性能无关.

  • 它运行约20%的速度与/MTd比/MT,即使输出回路看起来是一样的!

微小修改案例的汇编代码的不同之处在于:

  • 没有修改的循环(~300 ms):

    00403383  mov         esi,dword ptr [esp+10h] 
    00403387  mov         edx,dword ptr [esp+0Ch] 
    0040338B  mov         dword ptr [edx+esi*4],eax 
    0040338E  add         dword ptr [esp+10h],ecx 
    00403392  add         eax,ecx 
    00403394  cmp         eax,4000000h 
    00403399  jl          main+43h (403383h) 
    
    Run Code Online (Sandbox Code Playgroud)
  • 循环使用 /MTd(貌似相同,但〜270毫秒!):

    00407D73  mov         esi,dword ptr [esp+10h] 
    00407D77  mov         edx,dword ptr [esp+0Ch] 
    00407D7B  mov         dword ptr [edx+esi*4],eax 
    00407D7E  add         dword ptr [esp+10h],ecx …
    Run Code Online (Sandbox Code Playgroud)

c++ performance code-generation visual-c++

3
推荐指数
1
解决办法
304
查看次数

首先在实体框架模型中为生成的代码添加文档

自VS 2010以来,我一直在使用Entity Framework模型.当我构建项目时,EF会生成一个包含所有实体的Model.Designer.cs文件.此设计器文件还包含添加到EDMX文件中的实体的文档.

当我在VS 2012中创建新的EF模型第一个项目时,Model.tt文件被添加到我的EDMX文件中.此T4模板为模型中的每个实体生成单个文件.遗憾的是,EDMX文件中的文档未在生成的代码中使用.

我非常喜欢记录我的模型,因此IntelliSense在使用时会显示出来.到目前为止我找到的唯一解决方法是删除Model.tt和生成的类文件,然后重新启动我的EDMX文件上的代码生成.这将恢复到我在VS 2010中使用的行为.但是,我希望每个实体都有一个单独的文件.

有没有办法(最好使用VS工具而不必修改VS附带的任何文件)在生成的单个类文件中包含EDMX文件中的文档?

编辑:为了进一步说明我的问题,这是一个简单的例子.

假设我的模型看起来像这样:简单的实体框架模型

我在Id属性的Properties窗口中突出显示了我输入文档的部分.

这是EDMX文件中实体的样子:

    <EntityType Name="Entity1">
      <Key>
        <PropertyRef Name="Id" />
      </Key>
      <Property Type="Int32" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="Identity" >
        <Documentation>
          <Summary>This is documentation for the ID property.</Summary>
        </Documentation>
      </Property>
    </EntityType>
Run Code Online (Sandbox Code Playgroud)

Model.tt生成的类(Entity1.cs)如下所示:

public partial class Entity1
{
    public int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是当我为我的模型打开代码生成时,这就是实体在Model.Designer.cs中的样子:

/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmEntityTypeAttribute(NamespaceName="Model1", Name="Entity1")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class Entity1 : EntityObject
{
    #region Factory Method

    /// <summary>
    /// Create a new …
Run Code Online (Sandbox Code Playgroud)

code-generation entity-framework visual-studio-2012 ef-model-first

3
推荐指数
1
解决办法
4330
查看次数

LLVM后端:替换x86后端的间接jmps

我想替换jmp *(eax)代码中的间接指令以mov *(eax),ebx; jmp *ebx获取x86可执行文件.

在实现之前,我想制作LLVM编译器,每次jmp *(eax)通过添加一些打印语句检测到指令时记录输出.

然后我想继续替换间接序列.

从我从谷歌搜索和文章中看到的,我可以通过修改llvm后端中的x86asmprinter来实现这一点.但我不知道该怎么做.任何帮助或阅读将不胜感激.

注意:我的实际要求涉及间接跳转和弹出,但我想从此开始,以便在我深入了解之前了解更多后端.

x86 code-generation llvm codegen

3
推荐指数
1
解决办法
383
查看次数

设置null以使用mastruct定位

我正在使用mapstruct,我想知道是否有任何方法可以为某些目标属性设置null值。例如,

public class MySource {
    private String prop1;
    private String prop2;

    public MySource() {
        // Initialization.
    }

    // Getters - Setters.
}

public class MySourceDto {
    private String prop1;
    private String prop2;

    public MySourceDto() {
        // Initialization.
    }

    // Getters - Setters.
}

@Mapper
public interface MySourceMapper {

    @Mappings({
        @Mapping(target = "prop1", propertyToSetNull = null)})
    public MySourceDto toView(MySource mySource);

}
Run Code Online (Sandbox Code Playgroud)

我希望上面的源代码,dto和mapper可以生成下面的源代码,

@Component
public class MySourceMapperImpl implements MySourceMapper {

    @Override
    public MySourceDto toView(MySource mySource) {
        if ( mySource == null ) …
Run Code Online (Sandbox Code Playgroud)

java code-generation mapstruct

3
推荐指数
2
解决办法
2464
查看次数