海康威视面试题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.谈谈你做过的最满意的项目
2.局部变量、全局变量、静态全局变量的区别
3.谈谈C语言中你对指针的认识
4.int *p="123456";
char str1[]="123456";
char str2[100]="123456";
问:
1.上面哪一个是不合法的?
2.strlen(p)=?;
sizeof(p)=?;
strlen(str1)=?;//6
sizeof(str1)=?//7
strlen(str2)=?;//6
sizeof(str2)=?;//100

PS:strlen只统计真正保存的字符所占的内存大小,不包含'\0';sizeof负责统计已经分配了的内存大小,包含'\0'。

5.讲一下TCP中的3次握手
6.谈谈violate关键字的作用,还要分析一段相关的代码。由于不知道这个关键字,所以就没看代码,直接说不知道了。
7.谈谈socket网络编程中怎么建立可靠的TCP连接
8.说说C与C++的区别
9.在学校有人会请教你问题吗,你遇到问题是怎么解决的
10.谈谈你对堆、栈的认识
11.谈谈对动态内存的看法。

目前能回忆起的就这些,张斌有不同的可以补充。

violate关键字的用法
分类: C/C++ 2011-02-25 14:17 1897人阅读 评论(2) 收藏 举报
编译器优化任务调度任务service存储
由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:

static int i=0;

int main(void)
{
...
while (1)
{
if (i) dosomething();
}
}

/* Interrupt service routine. */
void ISR_2(void)
{
i=1;
}

程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此
可能只执行一次对从i到某寄存器的读***作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被
调用。如果将将变量加上volatile修饰,则编译器保证对此变量的读写***作都不会被优化(肯定执行)。此例中i也应该如此说明。

一般说来,volatile用在如下的几个地方:

1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

2、多任务环境下各任务间共享的标志应该加volatile;

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实
现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。


 


volatile 的含义
volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以死代码消除。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化,volatile的字面含义是易变的,它有下面的作用:

1 不会在两个***作之间把volatile变量缓存在寄存器中。在多任务、中断、甚至setjmp环境下,变量可能被其他的程序改变,编译器 自己无法知道,volatile就是告诉编译器这种情况。

2 不做常量合并、常量传播等优化,所以像下面的代码:
volatile int i = 1;
if (i > 0) ...

if的条件不会当作无条件真。

3 对volatile变量的读写不会被优化掉。如果你对一个变量赋值但后面没用到,编译器常常可以省略那个赋值***作,然而对Memory Mapped IO的处理是不能这样优化的。

前面有人说volatile可以保证对内存***作的原子性,这种说法不大准确,其一,x86需要LOCK前缀才能在SMP下保证原子性,其二,RISC根本不能对内存直接运算,要保证原子性得用别的方法,如atomic_inc。

对于jiffies,它已经声明为volatile变量,我认为直接用jiffies++就可以了,没必要用那种复杂的形式,因为那样也不能保证原子性。

你可能不知道在Pentium及后续CPU中,下面两组指令

inc jiffies
;;
mov jiffies, %eax
inc %eax
mov %eax, jiffies

作用相同,但一条指令反而不如三条指令快。
转自《海涛的笔记》

*************************************
1.区别静态变量,局部变量,全局变量
2.堆和栈的区别
3.静态变量,局部变量,全局变量是存储在堆和栈的中的哪一个部位?
4.什么是中断,中断的作用
5.
下列三个数组的表示哪些是错误的?
char *p = "0123456789abcdef";
char str[] = "0123456789abcdef";
char str1[100] = "0123456789abcdef";
以下表达式的值是多少
sizeof(p)
strlen(str)
sizeof(str)
sizeof(str1)
strlen(str1)

相关文档
最新文档