小编Tra*_*isG的帖子

遗传算法和进化策略有什么区别?

我已经阅读了几本书的介绍部分以及关于这两个主题的一些论文,并且我认为这两种方法几乎完全相同.也就是说,我还没有时间对主题进行深入研究,所以我可能错了.

遗传算法和进化策略之间有什么区别?是什么让他们与众不同,他们在哪里相似?

genetic-algorithm evolutionary-algorithm

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

我什么时候应该使用模板而不是继承,反之亦然?

在许多情况下,问题甚至不会问自己,因为有时继承提供了模板无法提供的必要功能.例如,当我需要通过一个基类型(多态)来处理不同的类型时,我需要使用继承.

但是,在某些情况下,问题可以通过继承和模板来解决.

举例来说,代码的某些部分采用类似策略模式的参数化:

文件解析器的一个解决方案可能如下所示:

class FileParser
{
   //...
   public:
      void Parse(ParsingAlgorithm* p);
   //...
}

void FileParser::Parse(ParsingAlgorithm* p)
{
   m_whatevertypeofvaluesineed = p->Parse(whateverparametersyouneed);
}
Run Code Online (Sandbox Code Playgroud)

其中ParsingAlgorithm是一个抽象基类,它提供了一些基本方法,需要由任何喜欢为FileParser类实现特定解析器的人继承.

但是,使用模板可以轻松实现相同的目的:

template <class Parser>
class FileParser
{
   //...
   public:
      void Parse()
      {
           m_whatevertypeofvaluesineed = m_parser.Parse(whateverparametersyouneed);
      }

   private:
      Parser m_parser;
   //...
}
Run Code Online (Sandbox Code Playgroud)

是否有一些通用规则可用于决定是使用模板还是继承?或者我应该尽可能简单地使用模板,以避免虚拟函数之类的运行时开销?

c++ inheritance templates

17
推荐指数
1
解决办法
6466
查看次数

Malloc vs自定义分配器:Malloc有很多开销.为什么?

我有一个图像压缩应用程序,现在有两个不同版本的内存分配系统.在最初的一个中,malloc在任何地方使用,在第二个中,我实现了一个简单的池分配器,它只分配一块内存并将部分内存返回给myalloc()调用.

我们在使用malloc时注意到了巨大的内存开销:在内存使用的高度,malloc()代码需要大约170兆字节的内存用于1920x1080x16bpp映像,而池分配器只分配48兆字节,其中47由程序使用.

在内存分配模式方面,程序为测试映像分配了大量8字节(大多数),32字节(许多)和1080字节块(一些).除此之外,代码中没有动态内存分配.

测试系统的操作系统是Windows 7(64位).

我们如何测试内存使用情况?

使用自定义分配器,我们可以看到使用了多少内存,因为所有malloc调用都被赋予分配器.使用malloc(),在调试模式下,我们只需逐步执行代码并在任务管理器中查看内存使用情况.在发布模式下我们也做了同样的事情,但由于编译器优化了很多东西,所以我们无法逐步完成代码(发布和调试之间的内存差异大约为20MB,我将其归因于在发布模式下优化和缺少调试信息).

可以单独使用malloc是导致如此巨大开销的原因吗?如果是这样,究竟是什么原因导致malloc内部的开销?

c memory malloc

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

LuaBind:如何将特定的类实例绑定到Lua?

(旁注:这是游戏编程)

使用LuaBind将整个类绑定到Lua很容易:

class test
{
   test()
   {
      std::cout<<"constructed!"<<std::endl;
   }

   void print()
   {
      std::cout<<"works!"<<std::endl;
   }
}
Run Code Online (Sandbox Code Playgroud)

//别的地方

   module[some_lua_state]
   [
      class_<test>("test")
      .def(constructor<>())
      .def("print",&test::print)
   ];
Run Code Online (Sandbox Code Playgroud)

现在我可以在Lua中创建该类的实例并使用它:

lua_example.lua

foo = test() //will print "constructed!" on the console
foo:print()  //will print "works!" on the console
Run Code Online (Sandbox Code Playgroud)

但是,现在我想将一个特定的测试实例绑定到Lua.这将使我能够将对象传递给Lua,例如Player类的实例,并执行以下操作:

Player:SetPosition(200,300)
Run Code Online (Sandbox Code Playgroud)

而不是采取艰难的方式,并有类似的东西

SetPosition("Player",200,300)
Run Code Online (Sandbox Code Playgroud)

相应的C++ SetPosition函数需要查找std :: map才能找到播放器.

这是否可能,如果是这样,我怎么能在LuaBind中做到这一点?

c++ lua luabind

9
推荐指数
1
解决办法
4233
查看次数

如何告诉static_assert constexpr函数参数是const?

我有一个constexpr函数,看起来像这样:

constexpr int foo(int bar)
{
   static_assert(bar>arbitrary_number, "Use a lower number please");

   return something_const;
}
Run Code Online (Sandbox Code Playgroud)

但是,使用GCC 4.6.3进行编译时不断告诉我

错误:'bar'不能出现在常量表达式中

我试过类似的东西

constexpr int foo(constexpr const int bar)
{
   static_assert(bar>arbitrary_number, "Use a lower number please");

   return something_const;
}
Run Code Online (Sandbox Code Playgroud)

但constexpr不能用于函数参数.

是否有一些简单的方法告诉编译器bar始终是编译时常量?

c++ constexpr c++11

9
推荐指数
2
解决办法
3888
查看次数

用于x86(MASM)程序集的免费IDE +汇编程序+软件模拟器?

我目前正在尝试进入x86程序集(我已经有一些预先存在的知识与x51程序集),我正在寻找一个简单的IDE +汇编程序+模拟器用于程序集输出.

你能推荐一下吗?

x86 assembly emulation

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

用整数哈希替换字符串名称有什么好方法

通常,数据驱动设计中的实体和组件或游戏代码的其他部分将具有检查的名称,如果您想要找出您正在处理的对象.

void Player::Interact(Entity *myEntity)
{
    if(myEntity->isNearEnough(this) && myEntity->GetFamilyName() == "guard")
    {
       static_cast<Guard*>(myEntity)->Say("No mention of arrows and knees here");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你忽略了这可能是过早优化的可能性,很明显,如果他们的"名称"是一个简单的32位值而不是实际的字符串,查找实体将会快得多.

计算字符串名称中的哈希值是一种可能的选择.我实际上没有尝试过,但是在32bit的范围和良好的散列函数下,碰撞的风险应该是最小的.

问题是:显然我们需要某种方法将代码内(或某种外部文件中)字符串名称转换为那些整数,因为处理这些命名对象的人仍然希望将对象称为"守卫" "而不是"0x2315f21a".

假设我们正在使用C++并希望替换代码中出现的所有字符串,这是否可以通过语言内置功能实现,还是我们必须构建一个外部工具来手动浏览所有文件并交换值?

c++ string

8
推荐指数
1
解决办法
773
查看次数

模板:只有在类有的情况下才执行方法

我想编写一个执行某个模板化类的方法的函数,但如果该类没有它,也应该编译好.在这种情况下,它应该不会调用该函数.

struct A
{
   void func() {}
};

struct B
{
};

template <typename T>
void anotherFunc(T t)
{
   //do t.func() here if T implements func, just do nothing if it doesn't.
}
Run Code Online (Sandbox Code Playgroud)

这有可能吗?

c++ templates template-function

6
推荐指数
1
解决办法
235
查看次数

通过按位选择删除分支

我被告知代码中的分支

int value = //some number;
if(value > some_other_value)
   value *= 23;
else
   value -= 5; 
Run Code Online (Sandbox Code Playgroud)

可以通过按位掩码消除(为了启用代码的SIMD优化):

const int Mask = (some_other_value-value)>>31;
value =      ((value * 23)&Mask)|((value-5)&~Mask);
Run Code Online (Sandbox Code Playgroud)

但是,我不明白这是如何工作的(尽管我理解这里使用的是什么操作以及结果在二进制中看起来如何).此外,这一般如何适用?如果原始代码是相似的,那该怎么办?

if(value & 1 == 1)
   value *= 23;
else
   value -= 5;
Run Code Online (Sandbox Code Playgroud)

分支删除的代码是否仍然相同?否则,面具的目的是什么,我应该如何创建呢?这里发生了什么?

c++ optimization

5
推荐指数
1
解决办法
1249
查看次数

手写笔/笔远离屏幕时的 WPF 手写笔事件

是否有可能(通过 StylusButtonDown 等或替代方案)对触控笔/笔未接触屏幕时发生的按钮按下(即触控笔按钮之一,而不是某些应用程序中的按钮)做出反应,即悬停在空中某处在笔记本的范围内?只有当笔尖实际接触屏幕表面时,这些才会触发。具体来说,我不需要知道按钮的位置。只是在按下桶形按钮时。

我正在使用 Microsoft Surface 和随附的 Surface Pen,如果这有什么不同的话。我不需要它是跨平台的、可移植的或任何东西。事实上,其他语言(C++等)的解决方案也可以。非常欢迎 Hacky 解决方案。

wpf stylus pen

5
推荐指数
1
解决办法
216
查看次数