来公司已经半年之久了,至少与自己的预期还是有不小的差距,无论是技术上的,还是生活中的状态。
今天狠下心来退群,清净自己的社交圈子,将大部分的精力集中在工作中,尤其是自己喜爱的技术中。
我觉得技术就是恋人,你对她多一份,她就会对你好十分。对了,这种状态不是恋人,而是我现在的对象。 :)
我不是对社交有恐惧而是从小的生活环境塑造了我一个人面对事情更舒适一些的性格,谈不上好的优点吧 。
最重要的头文件就是
这个函数在我看来就是可以用在改变io流的进制基数的,比如指定10进制或者16进制,可以看下下面的一个例子:
int main() {
std::cout << std::hex;
std::cout << std::setiosflags(std::ios::showbase | std::ios::uppercase);
std::cout << 100 << std::endl;
}
如果不指定std::hex和set::setiosflags的话,肯定输出的是100,但是实际的结果是 0X64(如何0x64?)
指定显示的字符宽度。
int main() {
cout << setw(4) << 123 << endl;
cout << "====" << endl;
}
// output:
// 123
// ====
[]
A scale of 2 decimal place. (小数点后两位)
最近的事情很多,但是也突然把自己的工作节奏打乱了,这个心气不能断啊,需要一鼓作气。 看到我们同龄的这些毕业生,我从来没想过会有一天在站在这个角度去看待他们。我就是比他们早来 几个月,有时候心里也是负担,但是我想在熟悉工作环境这块,应该是没人和我能打的。
要说还得从孩童时期说起。
小时候在林场放牛、放羊的画面还时刻萦绕在脑海中,我现在都能想起,我那时候,哪个牛捣乱、调皮 我怎么教训的它都能记起来。还有我那些曾经与我一起放牛羊的各位同伴,其中有一些人已经不在人世了。 我好像我还想,我长大了干什么呢?那个时候的我,成绩绝对支撑不起我现在的工作内容。
为什么我会想起这个呢?因为我觉得,从我自身的角度考虑,我已经很幸运了,遇到一个好的女友,还能有 机会从事自己喜欢的工作。那么,在这个过程中,一定有一些东西是我自己的救命稻草。
如果非要找出一个来,我会给自己两个字: 学习。
尽管以后的日子可能还会更艰难,这就看你自己怎么看了。至少,前半生的学习、求学让我自己可以混到 一个衣食无忧的工作。可以和我的小伙伴们一起比比,他们有些人目前的生活状态肯定不是他们想要的。 所以,接下来的信条或者信念,还是这两个字吧。
这篇文章的主要目的就是这部分,因为我时刻感觉自己在工作了以后有一些懈怠,这真是一个极度危险的 信号。刚刚接触这一行,还没有经历过历练,就有这种思想真的别想在软件行业混下去了。
我记得自己在求学期间,有好多次放弃的瞬间,为什么能够这么坚持下来,我有时候也不知道。此时, 自己作为新手在软件行业里不学习,就如同当年求学时期放弃上学的效果是一样的。虽然,我最后 不一定在一线或者互联网工作机会多的城市混,但是,我给自己定的人生目标就是,无论在哪里,就算在农村 的农场里,只要有时间、机会还是不要放弃学习,让自己一直到断气那天再说吧。
加油!
这个 runtime 的核心功能文件存放在 art/runtime/ 下,我们可以看一下common_runtime_test.cc这个文件
CommonRuntimeTestImpl这是一个基类,其中的析构函数确保删除dex文件。 std::string CommonRuntimeTestImpl::GetAndroidTargetToolsDir(InstructionSet isa) return GetAndroidToolsDIr(), 需要三个参数:体系目录、参数2、参数3.
SetUp() 建立最小的runtime 环境:
PreRuntimeCreate()
runtime_.reset(Runtime::Current()); class_linker_ = runtime_->GetClassLinker();
从SetUp()可以看出来,runtime这块需要处理的是Dex文件。 往下走: FinalizeSetUp() runtime_->GetHeap()->CreateThreadPool(); // 创建heap thread pool so that GC runs in parallel.正常情况下thread pool是由runtime创建的
runtime_->GetHead()->VerifyHeap(); // 在使用之前先要检查Heap的正确性
TearDown(): 这个函数在 art test 的代码中非常常见,这么说吧,这就是一个Gtest的一个前期环境搭建, 只要一运行这个函数也就说明gtest也在运行了
void CommonRuntimeTestImpl::TearDown() {
CommonArtTestImpl::TearDown();
if (runtime_ != nullptr) {
runtime_->GetHeap()->VerifyHeap(); // Check for heap corruption after the test
}
}
对,这又是一个简单的记录notes,因为我都不知道这背后是什么逻辑,或者说,是什么东西都不知道。
这个目录就是所谓的”优化”吧,具体是什么输入以及产生什么输出目前还有待确定。 整个文件在art/compiler/目录下,其中一个重要的结构体是 HGraph.
optimizing_unit_test.h:
// Create a control-flow graph from dex instructions
HGraph* CreateCFG(const std::vector<uint16_t>& data,
DataType::Type return_type = DataType::Type::kInt32) {
HGraph× graph = CreateGraph(); // 创建CFG的环境
// Align 4 bytes
}
所谓的非标准头文件就是指那些在aosp外不曾见过的文件或者一些库的用法。
这个在aosp中尤其常见,例如:
String8 argv_String;
for (int i = 0; i < argc; ++i) {
argv_String.append("\"");
argv_String.append(argv[i]);
argv_String.append("\" ");
}
ALOGV("app_process main with argv: %s", argv_String.string());
String8 的定义在 system/core/libutils/include/utils/String8.h 中,为什么不用std呢?从我看代码的了解中 看到String8照顾了UTF-8的特性, 而且其UTF-8的值不能超过0x10FFFFF,
/*
* Set the filename field to a specific value.
*
* Normalizes the filename, removing a trailing '/' if present.
*/
void setPathName(const char* name);
void setPathName(const char* name, size_t numChars);
/*
* Remove the last (file name) component, leaving just the directory
* name.
*
* "/tmp/foo/bar.c" --> "/tmp/foo"
* "/tmp" --> "" // ????? shouldn't this be "/" ???? XXX
* "bar.c" --> ""
*/
String8 getPathDir(void) const;
/*
* Return the filename extension. This is the last '.' and any number
* of characters that follow it. The '.' is included in case we
* decide to expand our definition of what constitutes an extension.
*
* "/tmp/foo/bar.c" --> ".c"
* "/tmp" --> ""
* "/tmp/foo.bar/baz" --> ""
* "foo.jpeg" --> ".jpeg"
* "foo." --> ""
*/
String8 getPathExtension(void) const;
/*
* Return the path without the extension. Rules for what constitutes
* an extension are described in the comment for getPathExtension().
*
* "/tmp/foo/bar.c" --> "/tmp/foo/bar"
*/
String8 getBasePath(void) const
...
简单摘抄了一点了,可以看出,aosp自己实现了一些有助于操作的函数,尤其对于一个涉及路径文件的字符串操作。