以下是故事:我正在使用AC6 Toolpack为Linux中的ARM Cortex-M0处理器开发C++软件.在我使用Keil(在windows中)(拥有自己的工具链)之前,我已经迁移到GNU-toolchain((GNU Tools for ARM Embedded Processors)5.2.1).我意识到的第一件事是; 二进制文件大小大幅增加.我已经测试了每个编译器优化(链接时间优化除外,它在内联汇编时出错,不是问题的一部分,但可能与答案有关).然后开始使用任何可用工具检查可执行文件(elf文件不是bin,gnu生成两者):objdump,readelf,nm.我发现一些符号导致尺寸增加,重要的是:' d_print_comp_inner',' d_exprlist',' d_template_args'.但不知道是什么导致这些函数出现在二进制文件中.(我使用过最小的库:nano newlib).长话短说我开始逐一消除代码以找到罪魁祸首.最后是抽象方法声明!
将功能定义为
virtual Return_type function_name(...)=0;
Run Code Online (Sandbox Code Playgroud)
代替
virtual Return_type function_name(...);
Run Code Online (Sandbox Code Playgroud)
添加45 KB和我提到的符号.这是源代码中唯一的变化.存在基类中的空定义.请注意:方法仍然是虚拟的,并在子类中被覆盖
没有抽象类的大小输出:
text data bss dec hex filename
15316 24 4764 20104 4e88 temc_discovery.elf
Run Code Online (Sandbox Code Playgroud)
抽象类的大小输出:
text data bss dec hex filename
61484 128 4796 66408 10368 temc_discovery.elf
Run Code Online (Sandbox Code Playgroud)
这里的方法是抽象的符号和他们的大小,消除了两个版本中出现的符号和他们的大小.(使用nm工具.不完整列表,大小> = 0x60的列表)
00002de4 t d_print_comp_inner
00001a34 t d_exprlist
00000ca4 t d_template_args
00000678 t d_type
00000574 t d_print_mod
000003f8 t d_encoding
000003e0 r …Run Code Online (Sandbox Code Playgroud) 我的计算机2.7和3.4.1上有两个python版本.我试图通过pip3.4安装numpy,这导致找不到vcvarsall.bat,我很确定它包含在系统路径中.然后我放弃了下载的numpy binary numpy-1.8.1-win32-superpack-python3.4.exe.在安装过程中,它告诉我numpy在注册表中找不到python 3.4,我发现它也存在.
Run Code Online (Sandbox Code Playgroud)HKEY_LOCAL_MACHINE -SOFTWARE --Python ---PythonCore ----2.7 -----Help -----InstallPath -----Modules -----PythonPath ----3.4 -----Help -----InstallPath -----Modules -----PythonPath
那么是什么让我从这里做的?我的系统是Windows 7 64位.
有人建议在这里使用的元组,而不是所有的公共建筑.我发现它很有用.但我现在的问题是以下部分:
using Edge = std::tuple<Node_wp,//From Node
Node_wp>;//To Node
using Edge_wp = std::weak_ptr<Edge>;
using Node = std::tuple<std::vector<Edge_wp>,//Incoming Edges
std::vector<Edge_wp>>;//Outgoing Edges
using Node_wp = std::weak_ptr<Node>;
Run Code Online (Sandbox Code Playgroud)
如何克服模板参数中的循环依赖性.由于在不知道类型节点的情况下无法形成类型Edge,因此前向声明(拥有我所拥有的知识)将无法工作,反之亦然.
显然,我可以制作其中之一struct并完成它.但是,在访问中打破对称性将是丑陋的.
import threading
def read_file():
f = open('text.txt')
for line in f:
print line.strip() ,' : ', threading.current_thread().getName()
if __name__ == '__main__':
threads = []
for i in range(15):
t = threading.Thread(target=read_file)
threads.append(t)
t.start()
Run Code Online (Sandbox Code Playgroud)
问题:每个线程是否只从上面的文件中读取每一行,或者某个给定的线程有可能最终读取一行两次?
我的理解是,稍后启动的线程将覆盖先前启动的线程的文件句柄,导致较早的线程最终读取几行两次或三次或更多次.
当我运行此代码时,结果与我预期的结果不同.
欢迎任何解释.