小编ify*_*ner的帖子

声明抽象类(纯虚方法)会大幅增加二进制大小

以下是故事:我正在使用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)

c++ arm gnu-toolchain gnu-arm cortex-m

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

numpy python 3.4.1安装:在注册表中找不到Python 3.4

我的计算机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,我发现它也存在.

HKEY_LOCAL_MACHINE
-SOFTWARE
--Python
---PythonCore
----2.7
-----Help
-----InstallPath
-----Modules
-----PythonPath
----3.4
-----Help
-----InstallPath
-----Modules
-----PythonPath
Run Code Online (Sandbox Code Playgroud)

那么是什么让我从这里做的?我的系统是Windows 7 64位.

python numpy python-3.x

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

模板参数中的循环依赖关系

有人建议在这里使用的元组,而不是所有的公共建筑.我发现它很有用.但我现在的问题是以下部分:

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并完成它.但是,在访问中打破对称性将是丑陋的.

c++ templates

4
推荐指数
1
解决办法
115
查看次数

多线程文件读取python

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)

问题:每个线程是否只从上面的文件中读取每一行,或者某个给定的线程有可能最终读取一行两次?

我的理解是,稍后启动的线程将覆盖先前启动的线程的文件句柄,导致较早的线程最终读取几行两次或三次或更多次.

当我运行此代码时,结果与我预期的结果不同.

欢迎任何解释.

python multithreading python-multithreading

0
推荐指数
1
解决办法
446
查看次数