Skip to content

Commit 8687251

Browse files
committed
update
1 parent f0d7125 commit 8687251

24 files changed

+409
-187
lines changed

Algorithm/Partition.md

Lines changed: 0 additions & 27 deletions
This file was deleted.

C++/Compiler.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ C/C++编译系统将一个程序转化为可执行程序的过程包含:
1111

1212
# 预处理
1313

14-
预处理器是在程序源文件被编译之前根据预处理指令对程序源文件进行处理的程序。预处理器指令以#号开头标识,末尾不包含分号。预处理命令不是C/C++语言本身的组成部分,不能直接对它们进行编译和链接。C/C++语言的一个重要功能是可以使用预处理指令和具有预处理的功能。C/C++提供的预处理功能主要有文件包含、宏替换、条件编译等。
14+
预处理器是在程序源文件被编译之前根据预处理指令对程序源文件进行处理的程序。**预处理器指令以#号开头标识,末尾不包含分号**。预处理命令不是C/C++语言本身的组成部分,不能直接对它们进行编译和链接。C/C++语言的一个重要功能是可以使用预处理指令和具有预处理的功能。C/C++提供的预处理功能主要有文件包含、宏替换、条件编译等。
1515

1616
## 文件包含
1717

@@ -124,7 +124,8 @@ helloworld.cpp 的源代码,仅仅有六行,而且该程序除了显示一
124124
hello, world
125125

126126

127-
参考
127+
# 更多阅读
128+
128129
[详解C/C++预处理器](http://blog.csdn.net/huang_xw/article/details/7648117)
129130
[Compiling Cpp](http://wiki.ubuntu.org.cn/Compiling_Cpp)
130131
[C++静态库与动态库](http://www.cnblogs.com/skynet/p/3372855.html)

C++/Keywords.md

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ const只是在`编译期的保护`,编译期会检查const变量有没有被
2020

2121
# static
2222

23-
《C和指针》中说static有两层含义:`指明存储属性;改变链接属性`。(1)全局变量(包括函数)加上static关键字后,链接属性变为internal,也就是将他们限定在了本作用域内;(2)局部变量加上static关键字后,存储属性变为静态存储,不存储在栈区,下一次将保持上一次的尾值。C 面向过程程序设计中的static:
23+
《C和指针》中说static有两层含义:`指明存储属性;改变链接属性`。(1)全局变量(包括函数)加上static关键字后,链接属性变为internal,也就是将他们限定在了本作用域内;(2)局部变量加上static关键字后,存储属性变为静态存储,不存储在栈区,下一次将保持上一次的尾值。
24+
25+
C 面向过程程序设计中的static:
2426

2527
1. 静态局部变量。在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持上一次的值不变,即只初始化一次(该变量存放在.bss 或者 .data 区,而不是栈区)。
2628
2. 静态全局变量。在模块内(但在函数体外),一个被声明为静态的变量可以被模块内函数访问,但不能被模块外访问。(注:模块可以理解为文件)。这样其它文件中可以定义相同名字的变量,不会发生冲突。
@@ -171,7 +173,7 @@ c++ 11 中也可以使用关键字 using 来进行类型别名的声明,上面
171173

172174
# register
173175

174-
一般情况下,变量的值是存放在内存中的。当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到CPU中的运算器。经过运算器进行运算,如果需要存数,再从运算器将数据送到内存存放。
176+
一般情况下,变量的值是存放在内存中的。当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到CPU中的运算器。经过运算器进行运算,如果需要存储,再从运算器将数据送到内存存放。
175177

176178
为提高执行效率,C++允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。这种变量叫做寄存器变量,用关键字register作声明。
177179

@@ -182,7 +184,7 @@ c++ 11 中也可以使用关键字 using 来进行类型别名的声明,上面
182184
return f;
183185
}
184186

185-
定义f和i是存放在寄存器的局部变量,如果n的值大,则能节约许多执行时间。不过要注意在程序中定义寄存器变量对编译系统只是建议性(而不是强制性)的。此外,现在的优化编译系统能够识别使用频繁的变量,自动地将这些变量放在寄存器中。
187+
定义f和i是存放在寄存器的局部变量,如果n的值大,则能节约许多执行时间。不过要注意在程序中**定义寄存器变量对编译系统只是建议性(而不是强制性)的**。此外,现在的优化编译系统能够识别使用频繁的变量,自动地将这些变量放在寄存器中。
186188

187189
# explicit
188190

@@ -240,17 +242,38 @@ int main()
240242
241243
# final
242244
243-
final关键字可用于修饰类、变量和方法。final修饰的类不能被继承,final修饰的方法不能被重写,final修饰的变量不可被修改,一旦获得初始值,该变量就不能被重新赋值。
244-
245-
class NoDerived final { /* */ };
246-
class Base { /* */ }; // Base 必须定义后才能作为基类
247-
class Last final: Base { /* */ };
248-
class Bad: Last { /* */ }; // 错误,Last 是 final的
249-
class Bad_2: NoDerived { /* */ }; // 错误,NoDerived 是 final的
245+
C++ 11 中引入了final关键字
246+
247+
> Specifies that a virtual function cannot be overridden in a derived class or that a class cannot be inherited from.
248+
249+
看一个简单的例子:
250+
251+
```c++
252+
struct Base
253+
{
254+
virtual void foo();
255+
};
256+
257+
struct A : Base
258+
{
259+
virtual void foo() final; // A::foo is final
260+
void bar() final; // Error: non-virtual function cannot be final
261+
};
262+
263+
struct B final : A // struct B is final
264+
{
265+
void foo(); // Error: foo cannot be overridden as it's final in A
266+
};
267+
268+
struct C : B // Error: B is final
269+
{
270+
};
271+
```
250272

251273
[final 描述错误](http://www.nowcoder.com/questionTerminal/8272c92814ca40c39f9a534485c90be2)
252274

253-
# 更多阅读
275+
# 更多阅读
276+
254277
[Meaning of “const” last in a C++ method declaration?](http://stackoverflow.com/questions/751681/meaning-of-const-last-in-a-c-method-declaration)
255278
[Type aliases (typedef / using)](http://www.cplusplus.com/doc/tutorial/other_data_types/)
256279
[How do I use extern to share variables between source files in C?](http://stackoverflow.com/questions/1433204/how-do-i-use-extern-to-share-variables-between-source-files-in-c)

Coding/Linux_OS_Pipe.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* @Author: [email protected]
3-
* @Last Modified time: 2016-04-25 11:45:30
3+
* @Last Modified time: 2016-08-28 11:11:10
44
*/
55

66
#include <unistd.h>
@@ -39,9 +39,10 @@ int main()
3939
else if(pid>0) // 父进程
4040
{
4141
close(pipe_fd[0]); // 关闭读端
42-
strcpy(w_buf,"1111222233334444\n");
43-
if(write(pipe_fd[1],w_buf,16)!=-1){
44-
printf("Write data %s", w_buf);
42+
const char* content = "1111222233334444";
43+
strncpy(w_buf, content, strlen(content));
44+
if(write(pipe_fd[1],w_buf, strlen(content))!=-1){
45+
printf("Write data %s\n", w_buf);
4546
printf("Parent write over\n");
4647
}
4748
close(pipe_fd[1]); // 关闭写端

Coding/Linux_OS_Pipe_R.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* @Author: [email protected]
3+
* @Last Modified time: 2016-08-28 16:42:20
4+
*/
5+
6+
#include <stdio.h>
7+
#include <fcntl.h>
8+
#include <cstdlib>
9+
#include <unistd.h>
10+
const int SIZE = 4;
11+
12+
int main(int argc, char *argv[])
13+
{
14+
// 只读模式打开命名管道
15+
int read_fd = open("named_pipe", O_RDONLY);
16+
if (read_fd == -1){
17+
printf("Open fifo error!\n");
18+
exit(-1);
19+
}
20+
21+
char buf[SIZE];
22+
int readBytes;
23+
printf("Read data as follows: \n");
24+
while ((readBytes = read(read_fd, buf, sizeof(buf))) > 0)
25+
{
26+
printf("%s\n", buf);
27+
}
28+
29+
unlink("named_pipe"); //删除FIFO
30+
return 0;
31+
}

Coding/Linux_OS_Pipe_W.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* @Author: [email protected]
3+
* @Last Modified time: 2016-08-28 16:37:05
4+
*/
5+
6+
#include <stdio.h>
7+
#include <fcntl.h>
8+
#include <unistd.h>
9+
#include <sys/stat.h>
10+
#include <cstdlib>
11+
#include <cstring>
12+
13+
const int SIZE = 1024;
14+
15+
int main(int argc, char *argv[])
16+
{
17+
// 创建匿名管道
18+
if (mkfifo("named_pipe", 0644) == -1){
19+
printf("Create named pipe failed.\n");
20+
exit(-1);
21+
}
22+
23+
printf("Open named pipe with pending modle...\n");
24+
int write_fd = open("named_pipe", O_WRONLY); //打开文件
25+
if (write_fd == -1){
26+
printf("Open named pipe failed!\n");
27+
exit(-1);
28+
}
29+
const char *content = "1111222233334444";
30+
if(write(write_fd, content, strlen(content)) != -1)
31+
{
32+
printf("Write data: \n");
33+
printf("%s\n", content);
34+
}
35+
close(write_fd);
36+
return 0;
37+
}
38+

DataBase/Engine.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截
5959
* 外键约束;
6060
* 行锁定。
6161

62-
6362
# 更多阅读
6463

6564
[MySQL: InnoDB 还是 MyISAM?](http://coolshell.cn/articles/652.html)

DataBase/SQL_More.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
SQL标准中定义了4种隔离级别,每一个级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高地并发,系统的开销也更低。
1515

1616
* READ UNCOMMITED(未提交读):事务中的修改,即使没有提交,对其它事务也都是可见的。可能发生`脏读`:即事务可以读取未提交的数据。(实际中很少使用)
17-
* READ COMMITTED(提交读):满足事务隔离性的简单定义:一个事务开始时,只能看见已经提交的事务所做的修改。这个级别有时候也叫做`不可重复读`,因为它不保证事务重新读的时候能读到相同的数据,因为在每次数据读完之后其他事务可以修改刚才读到的数据。考虑下面这种情况:A事务读取一个数据项var=1,然后B事务更新该数据var=2并提交,A事务接着又重新读了该数据,结果var=2,第二次读到的数据和第一次的不相同。大多数数据库系统的默认隔离级别是 READ COMMITTED(但是MySQL不是)
17+
* READ COMMITTED(提交读):满足事务隔离性的简单定义:一个事务开始时,只能看见已经提交的事务所做的修改。这个级别有时候也叫做`不可重复读`,因为它不保证事务重新读的时候能读到相同的数据,因为在每次数据读完之后其他事务可以修改刚才读到的数据。考虑下面这种情况:A事务读取一个数据项var=1,然后B事务更新该数据var=2并提交,A事务接着又重新读了该数据,结果var=2,第二次读到的数据和第一次的不相同。大多数数据库系统的默认隔离级别是 READ COMMITTED(但是MySQL不是)
1818
* REPEATABLE READ(可重复读):只允许读取已经提交的数据,而且`在一个事务两次读取一个数据项期间,其它事务不得更新该数据`。但该事务不要求和其它事务可串行化。可能存在`幻读`问题:当某个事物在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。可重复读是 MySQL 的默认事务隔离级别。
1919
* SERIALIZABLE(可串行化):最高的隔离级别,通过强制事务串行执行,避免前面的幻读问题。会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。
2020

Java/README.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
Java是一个支持并发、基于类和面向对象的计算机编程语言。
2+
3+
4+
5+
String 是最基本的数据类型吗?
6+
7+
Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。
8+
9+
# 数据类型
10+
11+
Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
12+
13+
Java 为每个原始类型提供了包装类型:
14+
15+
- 原始类型: boolean,char,byte,short,int,long,float,double
16+
- 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
17+
18+
看下面简单的示例:
19+
20+
```Java
21+
class AutoUnboxingTest {
22+
public static void main(String[] args) {
23+
Integer a = new Integer(3);
24+
Integer b = 3; // 将3自动装箱成Integer类型
25+
int c = 3;
26+
System.out.println(a == b); // false 两个引用没有引用同一对象
27+
System.out.println(a == c); // true a自动拆箱成int类型再和c比较
28+
29+
Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
30+
System.out.println(f1 == f2); // true
31+
System.out.println(f3 == f4); // false
32+
}
33+
}
34+
```
35+
36+
需要注意的是f1、f2、f3、f4四个变量都是Integer对象引用,所以下面的 == 运算比较的不是值而是引用。如果整型字面量的值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,所以上面的面试题中`f1==f2`的结果是true,而`f3==f4`的结果是false。
37+
38+
String和StringBuilder、StringBuffer的区别?
39+
40+
Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高
41+
42+
43+
# 常用函数
44+
45+
```Java
46+
System.out.println(Math.round(11.5)); // 12
47+
System.out.println(Math.round(-11.5)); // -11
48+
```
49+
50+
round() 在参数上加0.5然后进行下(小)取整。
51+
52+
53+
# JVM 机制
54+
55+
56+
# 更多阅读
57+
58+
[Java面试题全集(上)](http://blog.csdn.net/jackfrued/article/details/44921941)
59+

Linux_OS/Fork.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ fork()系统调用是Unix下以自身进程创建子进程的系统调用,一
8282

8383
就没有问题了(就是6个“-”了),因为程序遇到“\n”,或是EOF,或是缓冲区满,或是文件描述符关闭,或是主动flush,或是程序退出,就会**把数据刷出缓冲区**。需要注意的是,标准输出是行缓冲,所以遇到“\n”的时候会刷出缓冲区,但对于磁盘这个块设备来说,“\n”并不会引起缓冲区刷出的动作,那是全缓冲,你可以使用setvbuf来设置缓冲区大小,或是用fflush刷缓存。
8484

85-
参考:
85+
# 更多阅读
8686
[陈皓:一个 fork 的面试题](http://blog.jobbole.com/24686/)
8787

8888

0 commit comments

Comments
 (0)