使用不等大小的输入操作数实现Karatsuba大数乘法的最有效方法是什么,其大小不是2的幂,甚至可能不是偶数?填充操作数意味着额外的内存,我想尝试使其具有内存效率.
我在非偶数大小的Karatsuba中注意到的一件事是,如果我们试图将数字分成尽可能接近偶数的"一半",一半将有m + 1个元素而另一个m,其中m = floor(n/2),n是分割数中的元素数.如果两个数字具有相同的奇数,那么我们需要计算两个大小为m + 1的数量的乘积,需要n + 1个存储,而n是偶数时的n.所以我正确地猜测奇数尺寸的Karatsuba可能需要比偶数尺寸更多的内存?
这是受到对我的另一个问题的评论的启发:
在C++中为类提供可访问的"名称"时,您如何"不重复自己"?
nvoight:"RTTI很糟糕,因为它暗示你没有做好OOP.做自己的自制RTTI不会让它更好OOP,它只是意味着你在糟糕的OOP之上重新发明轮子."
那么这里的"优秀OOP"解决方案是什么?问题是这个.该程序是用C++编写的,因此下面还提到了C++特定的细节.我有一个"组件"类(实际上是一个结构),它被子类化为包含不同类型组件数据的许多不同的派生类.它是游戏"实体组件系统"设计的一部分.我想知道组件的存储.特别是,当前的存储系统具有:
"组件管理器",用于存储单个类型组件的数组,实际上是哈希映射.哈希映射允许通过其所属实体的实体ID来查找组件.此组件管理器是从基础继承的模板,模板参数是要管理的组件类型.
一个完整的存储包,它是这些组件管理器的集合,实现为指向组件管理器基类的指针数组.这有插入和提取实体的方法(插入时,组件被取出并放入管理器,删除时,它们被提取并收集到新的实体对象中),以及添加新组件管理器的方法,所以如果我们想要为游戏添加新的组件类型,我们所要做的就是为其插入一个组件管理器.
这是提示这一点的完整存储包.特别是,它无法访问特定类型的组件.所有组件都存储为基类指针,没有类型信息.我想到的是使用某种RTTI并将组件管理器存储在映射类型名称的映射中,从而允许查找,然后适当地向下转换指向相应派生类的基类指针(用户将调用模板成员)在实体存储池上执行此操作).
但是如果这个RTTI意味着糟糕的OOP,那么设计这个系统的正确方法是什么,所以不需要RTTI?
考虑以下:
class Base {
public:
virtual std::string getName() = 0;
...
};
class Derived1 : public Base {
public:
static std::string getClassName() { return("Derived1"); }
std::string getName() { return("Derived1"); }
...
};
class Derived2 : public Base {
public:
static std::string getClassName() { return("Derived2"); }
std::string getName() { return("Derived2"); }
...
};
Run Code Online (Sandbox Code Playgroud)
这个想法是,如果您将派生类作为模板参数传递,那么您可以通过它获取其类名getClassName,而如果您将它作为指向基类的指针传递,则可以通过获取名称getName.
我在这里看起来有很多类似的问题但是所有人似乎都在问"我如何使用静态虚拟","为什么不存在静态虚拟"以及类似的各种东西,而答案似乎是解决的问题不仅仅是我认为真正的潜在问题,那就是:我怎样才能避免重复使用该代码并在尽可能少的样板文件中提及名称两次?(不要重复自己,或干燥规则)
我也不想要一个宏.
如何在CMake中处理这种编译情况?假设我们有一个包含子目录的源代码目录
src:
helper:
innerpkg:
a.cpp
a.h
helper.cpp
helper.h
main.cpp
main.h
Run Code Online (Sandbox Code Playgroud)
文件a.cpp调用文件helper.cpp中的东西,虽然helper.cpp可能不会调用a.cpp中的任何内容.因此,如果我们让helper子目录成为库,而innerpkg成为库,我们就会遇到一个问题,其中helper需要包含innerpkg,但innerpkg也需要帮助 - 一个循环依赖.处理这个问题的正确方法是什么,仍然将一些源文件保留在帮助程序中?顺便说一下,我很擅长使用CMake.
编辑:innerpkg中的CMakeLists.txt文件可能如下所示:
include_directories(${CCMBS_SOURCE_DIR})
set(INNERPKG_SRC a.cpp)
add_library(innerpkg ${INNKERPKG_SRC})
Run Code Online (Sandbox Code Playgroud)
在帮手:
include_directories(${PROJ_SOURCE_DIR})
add_subdirectory(innerpkg)
set(HELPER_SRC helper.cpp)
add_library(helper ${HELPER_SRC})
target_link_libraries(ui "-Wl,--whole-archive")
target_link_libraries(ui innerpkg)
target_link_libraries(ui "-Wl,--no-whole-archive")
Run Code Online (Sandbox Code Playgroud)
如果这有帮助.如何设置这些来解决这个问题?
编辑:确切的依赖结构是这样的:innerpkg中的东西取决于helper中的东西.innerpkg由main使用.另一种情况是助手也依赖于innerpkg中的东西,即循环依赖,而main则使用helper或innerpkg.