我是C++的新手,我在项目中使用了矢量类.我发现它非常有用,因为我可以有一个数组,只要有必要就会自动重新分配(例如,如果我想推送一个项目并且向量已达到它的最大容量,它会重新分配自己,为操作系统提供更多的内存空间),所以对向量元素的访问非常快(它不像列表,要达到"第n"元素,我必须通过"n"个第一个元素).
我发现这个问题非常有用,因为当我想将我的向量存储在堆/堆栈上时,他们的答案完全解释了"内存分配器"是如何工作的:
[1] vector<Type> vect;
[2] vector<Type> *vect = new vector<Type>;
[3] vector<Type*> vect;
Run Code Online (Sandbox Code Playgroud)
然而,怀疑是困扰我一段时间,我找不到它的答案:每当我构建一个向量并开始推入大量项目时,它将达到向量将满的时刻,因此继续增长它需要重新分配,将自身复制到一个新位置,然后继续push_back项(显然,这个重新分配它隐藏在类的实现上,所以它对我来说是完全透明的)
好吧,如果我在堆上创建了向量[2],我没有想象可能发生的事情:类向量调用malloc,获取新空间然后将自身复制到新内存中,最后删除调用free的旧内存.
然而,当我在堆栈上构造一个向量时,面纱会隐藏正在发生的事情[1]:当向量必须重新分配时会发生什么?AFAIK,无论何时在C/C++上输入一个新函数,计算机都会查看变量声明,然后展开堆栈以获得放置这些变量所需的空间,但是当你在堆栈中分配更多空间时功能已在运行.类向量如何解决这个问题?
对于我的面向对象编程课程,我必须做一个最终的项目(学术目的).我想让一个proyect"正确的方式"(即:makefile,模块化,DRY,易于扩展等),以便更好地理解类,makefile和C++.
我的想法是拥有一个"tree-source-file-structure-directory",所以在每个子文件夹中我都有源文件,包含它的头文件,测试文件和单个makefile.因此,如果我想在界面上工作,我会转到子文件夹界面,我编辑文件,运行测试,如果一切正常,只需将对象链接在我的根目录上.同样的事情,如果我想处理我的数据结构,所以继续.好的功能是每个子文件夹都驻留在源代码和目标文件中,因此我的根目录中的链接器将搜索已在子文件夹上编译的目标文件并将它们链接在一起
我一直在网上搜索,我可以看到许多不同的解决方案: - 做递归,例如:
SUBDIRS=eda
.PHONY: subdirs $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@
Run Code Online (Sandbox Code Playgroud)
我发现的问题是我在"eda"文件夹中的先决条件是"古怪"
- 使用自动变量 $(@ D),但我不太明白它是如何工作的 - 也许使用通配符函数,但我对这个选项有点困惑.
无论如何,对我来说最诱人的解决方案是第一个(使用make递归),但我发现很多评论说不建议使用make递归有趣的文章
所以我想问你们一些建议:我如何实现目标并将每个重要模块放在一个单独的文件夹中?是递归制作最佳解决方案吗?也许我应该潜入"automake"?或者将所有目标文件带到根目录下的新"对象"子文件夹然后将它们链接在一起会更好?
顺便说一句,我通过嗅探Amarok源代码来获取灵感来使用这个树结构:它有一个名为"src"的子文件夹,当你进入那里时,你可以看到很多子文件夹:均衡器,播放列表,动态,statusbar,core,playlistgenerator,playlistmanager等.许多子文件夹都有自己的子目录......结果是一个令人难以置信的音乐播放器.如果这种方法适用于Amarok团队......我可以做类似的事情!
欢迎任何评论,反馈,建议和其他人,提前感谢!
编辑#1
Beta,我有一些隐式规则(后缀)和链接器的目标,需要我的eda文件夹上的对象.此目标的每个其他先决条件都建立在当前文件夹上.我遇到的问题是,当我运行make来构建该目标时,它将我在"eda"文件夹上的先决条件的名称作为使用隐式规则构建的目标.这是makefile在我的proyect中递归的棘手/不洁的部分:我想我必须为每个必须在子文件夹中搜索的目标文件创建一个特殊的隐式规则.
这就是我想要一些反馈的原因:¿有更好的选择吗?或者在我的proyects中使用make递归的优势压倒了其他选择?
无论如何,如果给你更好的理解,这是我的草稿Makefile(它是spnish-english:P)
#Makefile hecho para las pruebas de los archivos dentro de esta carpeta
FLAGS=-g -DDEBUG
OUT_TI=TIndividuo
OUT_TP=TProfesor
OUT_TA=TAula
.SUFFIXES: .cpp .c .h .o
.c.o: ; cc $(FLAGS) -c $*.c
.cc.o: ; gcc $(FLAGS) -c $*.cc
.cpp.o: ; g++ $(FLAGS) …Run Code Online (Sandbox Code Playgroud)