从事软件开发多年对于C/C++用的比较多,可以明确说这两种编程语言也是支持跨平台,肯定还是有很多人问什么是真正意义上的跨平台,所谓的跨平台就是同一套代码在不同的操作系统都能直接去运行,这里面涉及到一个很重要的问题...,在java这门编程语言刚开始流行的时候就提到了跨平台的功能,在windows上运行的jar包直接放在linux上也能直接去运行,单纯从C/C++角度出发也是能够实现这种功能的,因为其语法实现是相同的。...,在具体软件的核心架构上代码是一致的,和平台相关的代码还是需要单独去实现,就拿简单的线程的实现,不同的操作系统的接口就存在很大的差异,所以完全意义上的跨平台方面距离高级编程语言还是存在差异。...编译器其实就是一种转化工具,将程序转化成能够运行的二进制文件,一般而言C/C++编译器是可以通用的,不同的操作系统使用不用的编译器底层。 ?...编译器是一种工具包的集合,内部的实现也涉及到C/C++的编程,编译器的通常说的编程代码还是存在一定的差异,编译器是为代码转化做服务的,真正实现跨平台的基础部件编译器算是一种,因为不同的操作系统或者计算机架构需要具体的对应实现
,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。...如果键入volatile,则编译器会逐一地进行编译并产生相应的机器代码(产生四条代码)。...编译器的优化 在本次线程内,当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后再取变量值时,就直接从寄存器中取值; 当变量值在本线程里改变时,会同时把变量的新值copy...到该寄存器中,以便保持一致 当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致; 当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致...结果,这段代码可能返回的不是你所期望的平方值!
为什么有时会出现无法解析的外部符号? 为什么有的内联函数的定义需要写在头文件中? 为什么对于模板,声明和定义都要写在一起?...,可以参照我之前的一篇博客 C++编译与链接(1)-编译与链接过程 编译单元 首先让我们来认识一下编译单元,什么是编译单元呢?...最后让我们回到文章开头处的那几个问题吧 为什么有时会出现aaa已在bbb中重定义的错误?...答:你可能在不同的cpp中重复定义了一个具有外部链接的函数或变量,链接器在链接时找到了多个一样的函数或变量定义 为什么有时会出现无法解析的外部符号?...答:你可能只提供了函数或变量的声明,没有提供其定义,或者声明和定义的函数原型不一致,链接器没有找到其定义在哪里,所以在链接环节出现了无法解析的外部符号的错误 为什么有的内联函数的定义需要写在头文件中呢?
多线程应用中被几个任务共享的变量 回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。...这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码: int square(volatile int *ptr)...结果,这段代码可能返不是你所期望的平方值!...编译器的优化 (请高手帮我看看下面的理解) 在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值; 当变量值在本线程里改变时...ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此 可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的
: 在程序设计中,尤其是在C语言、C++、C#和Java语言中,使用volatile关键字声明的变量或对象通常具有与优化、多线程相关的特殊属性。...通常,volatile关键字用来阻止(伪)编译器认为的无法“被代码本身”改变的代码(变量/对象)进行优化。...如在C语言中,volatile关键字可以用来提醒编译器它后面所定义的变量随时有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数。...如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。...这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。
这有点超出正常的认知,明明定义了字符串test1,并且只有简单的2行代码,为什么会crash呢? 现象解释 要解释这种现象,需要了解Android虚拟机字符串处理机制。...这样我们编译时产生的机器码实际上依赖的是早先apk自身的Test类的代码,而运行的时候是执行的注入dex中的代码,虚拟机在解析这个0x4ee2字符串索引时候,会从注入的dex的字符串常量池中查找,实际上这个...dex的字符串数目是非常少的,尽管我们在代码里面添加了26个新的字符串。...总结 我们使用不同jar/dex中新的class覆盖旧的class时,需要注意,在inline场景下,编译器会将一些索引硬编码到机器码中,导致与运行时的数据不一致。...归根结底,是编译时依赖与运行时依赖jar/dex不一致引发的问题,需要格外注意。
问题背景 背景就简单点儿说,当初一个项目 C# 编写,涉及浮点运算,来龙去脉省去,直接看如下代码。(为什么有这个问题产生,是因为当初线上产生了很诡异的问题,和本地调试效果不一致。)...-202014162,没问题,难道C#没有产生这样的结果?...其实上面这段C++代码在不同的平台下的结果如下: Windows 32/64位下:-202014160 Linux 64位下(CentOS 6 gcc 4.4.7):-202014160 Linux 32...若是用两个double相乘可得正确且合理的运算结果。// 就别纠结我用的“正确、合理”这两个词是否恰当了。问题是为何C#下X64和X86结果不一致?...所以大家在写代码的时候得保证实际运行环境/测试环境/开发环境的一致性(包括OS架构啊、编译选项等)啊,不然莫名其妙的问题会产生(本文就是开发环境与运行环境不一致导致的问题,纠结了好久才发现是这个原因);
在开始编译Android程序时必须要有一个匹配的虚拟设备,以便呈现出Android的运行界面。 要想创建一个AVD,首先打开命令行工具cmd, 进入Android SDK的Tools目录。...输入下面的命令: android list targets 输出结果会显示目前可用的AVD设备标识(实际输出结果与你的环境有关): id:1 Name: Android 1.1 Type: platform...你的mainefest.xml文件里没有注册MainActivity这个类 你的mainefest.xml里注册了一个MainActivity类,但是你的src里没有写这个类 我是改了包名,却没有在清单文件中改了...C:\Users\ADMINI~1\AppData\Local\Temp\AndroidEmulator目录下都是系统产生的垃圾文件,每次运行后都可以删除。 Jar mismatch!...Fix your dependencies 在开发Android项目的时候,有时需要引用多个项目作为library。在引用项目的时候,有时会出现“Jar mismatch!
在开始编译Android程序时必须要有一个匹配的虚拟设备,以便呈现出Android的运行界面。 要想创建一个AVD,首先打开命令行工具cmd, 进入Android SDK的Tools目录。...输入下面的命令: [java] view plaincopy android list targets 输出结果会显示目前可用的AVD设备标识(实际输出结果与你的环境有关): [java]...你的mainefest.xml文件里没有注册MainActivity这个类 你的mainefest.xml里注册了一个MainActivity类,但是你的src里没有写这个类 我是改了包名,却没有在清单文件中改了...C:\Users\ADMINI~1\AppData\Local\Temp\AndroidEmulator目录下都是系统产生的垃圾文件,每次运行后都可以删除。 Jar mismatch!...Fix your dependencies 在开发Android项目的时候,有时需要引用多个项目作为library。在引用项目的时候,有时会出现“Jar mismatch!
不要把data中的任何一项的value设为undefined,否则这一项将不能被设置,可能会有潜在的问题 使用:先给出代码,wxss没有什么意义就不贴了。...:test02 is not defined; 为什么呢?...setData()注意事项 1、频繁的去setData 在我们分析过的一些案例里,部分小程序会非常频繁(毫秒级)的去setData,其导致了两个后果: Android下用户在滑动时会感觉到卡顿,操作反馈延迟严重...,因为JS线程一直在编译执行渲染,未能及时将用户操作事件传递到逻辑层,逻辑层亦无法及时将操作处理结果及时传递到视图层; 渲染有出现延时,由于WebView的JS线程一直处于忙碌状态,逻辑层到页面层的通信耗时上升...脚本过程,当数据量过大时会增加脚本的编译执行时间,占用WebView JS线程。
背景 在实际项目开发中,特别是涉及到中文输入输出的时候,大家肯定都被各种乱码问题坑过。如果遇到复杂的系统,为了乱码问题折腾几天也不是不可能。 在最近的项目中,我也遇到了一个头疼的乱码问题。...我们在项目中约定Java代码中凡是涉及到文件的输入输出以及控制台输入输出,所有的编码格式都采用UTF-8。 既然是这样,为什么还会出现乱码?这里只能从代码和结果着手,一步一步的分析和定位。...在远程服务上检查“结果报告1”,发现文件格式的确是UTF-8,中文内容也都能正常显示,所以,排除远程服务问题。那么,乱码的产生应该是远程服务生成的文件及其内容在后续传递过程中发生了编码格式的变化。...从这里可以看出,问题不是出现在Java Service本身,而是出现在消息的传递过程中。 通过阅读JVM的文档资料发现,JVM在启动时会设置一个默认的字符集编码。...当编译时的编码格式与源文件的编码格式不一致时,很可能出现编译失败问题。 2、Java class文件编码 无论源文件的编码格式是什么,Java class文件都是Unicode编码(UTF-16)。
原文出处http://cmsblogs.com/ 『chenssy』 昨天有位小伙伴问我一个 ArrayBlockingQueue 中的一个构造函数为何需要加锁,其实这个问题我还真没有注意过。...如果不加锁为什么就没法保证 items 的可见性呢?这其实是指令重排序的问题。 什么是指令重排序?编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段。...为什么说指令重排序会影响 items 的可见性呢?...其实线程 A 可能还正在执行构造函数中的某一个行代码。两个线程在不加锁的情况对一个不具备线程安全的数组同时操作,很有可能会引发线程安全问题。 还有一种解释:缓存一致性。...在不加锁的前提下,线程 A 在构造函数中 items 进行操作,线程 B 通过入队、出队的方式对 items 进行操作,这个过程对 items 的操作结果有可能只存在各自线程的缓存中,并没有写入主存,这样肯定会造成数据不一致的情况
在-128到127范围内的赋值,Integer对象在IntegerCache.cache产生,会复用已有对象,这个区间的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据都会在堆上产生...面试题 先来看一道常见的面试题,对照上面的结论,看看能够答对几项。下面代码中打印结果为true的有几项?.../ 包装类型为引用类型,编译时会自动装拆箱,数据在堆上,指针在栈 } } 基础类型的栈内存储 通过上面的实例,基本了解了不同类型的值的内存分配情况。...假设编译器先处理int a=3,此时会在栈中创建a的引用变量,然后查找栈中是否存在3这个值,如果没有就将3存放进来,然后将a指向3。 接着处理int b=3,创建完b的引用变量后,同样进行查找。...因为通过new和valueOf创建的是完全两个对象,那么针对题目中的C项,直接比较两个对象的引用肯定是不相等的,因此结果为false。但B项为什么为true呢?后面我们会讲到。
,编译器认为前面循环半天都是废话,对最后的结果毫无影响,因为最终只是将output这个指针赋值为 9,所以编译器最后给你编译编译的代码结果相当于: int init(void) { *output...反之如果你不是对此端口反复写操作,而是反复读操作,其结果是一样的,编译器在优化后,也许你的代码对此地址的读操作只做了一次。然而从代码角度看是没有任何问题的。...3)多任务环境下各任务间共享的标志,应该加volatile; 在本次线程内, 当读取一个变量时,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当内存变量或寄存器变量在因别的线程等而改变了值...编译器将产生类似下面的代码: int square(volatile int*ptr) { int a,b; a = *ptr; b = *ptr; return a * b; } 由于...结果,这段代码可能返不是你所期望的平方值!
最近,小黑哥在一个业务改造中,使用三目运算符重构了业务代码,没想到测试的时候竟然发生 NPE 的问题。 ?...但是我的代码并没有对这个方法返回值做任何操作,为何会触发 NPE? 难道是又是自动拆箱导致的 NPE 问题? 在解答这个问题之前,我们首先复习一下条件表达式。 点赞再看,养成习惯。...nullInteger : simpleInt; 这个案例为开头的例子的简化版本,运算上述代码,将会发生 NPE 的。 为什么会发发生 NPE 呢?...那么为什么 Java 编译器在编译时会对表达式进行拆箱?难道所有数字类型的包装类型都会进行拆箱吗?...但是由于 result是 int 基本数据类型,好家伙,数据类型不一致,编译器将会对条件表达式的结果进行自动拆箱。由于结果为 null,自动拆箱将报错了。
前言: 今天给大家分享的一个知识点,这也是我最近在项目中使用过的一个c语言知识点,关键字volatile,这个关键字在stm32的代码里面经常看到,以前我对这个关键字理解的不是特别深;ok,下面分两期文章来分析这个关键字...ISR_2中断产生时,在main函数中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的...反之如果你不是对此端口反复写操作,而是反复读操作,其结果是一样的,编译器在优化后,也许你的代码对此地址的读操作只做了一次。然而从代码角度看是没有任何问题的。...volatile的本质: 编译器的优化:在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当变量值在本线程里改变时...当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。
explicit 三、常见面试题 零、前言 本章主要学习C++的四种类型转换 一、C语言的类型转换 概念及介绍: 在C语言中,如赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时...,就需要发生类型转化 C语言中的两种形式的类型转换: 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败 显式类型转化:需要用户自己处理 示例: void Test () {...显式类型转换将所有情况混合在一起,代码不够清晰 因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格 二、C++强制类型转换 标准C...// 所以非常的BUG,下面转换函数指针的代码是不可移植的,所以不建议这样用 // C++不保证所有的函数指针都被一样的使用,所以这样用有时会产生不确定的结果 // FUNC...基类必须要有虚函数 对于下行转换,dynamic_cast是安全的(当类型不一致时,转换过来的是空指针),而static_cast是不安全的(当类型不一致时,转换过来的是错误意义的指针,可能造成踩内存
Devserver 会启动一个 HTTP 服务器用于服务网页请求,同时会帮忙启动 webpack,并接收 webpack 发出的文件变更信号,通过 webSocket 协议自动刷新网页做到实时预览 为什么直接修改...什么是动态链接库 在 windows 系统中,我们会经常看到 .dll 为后缀的文件,这种文件叫做动态链接库,在一个动态链接库中可以包含为其他模块调用的函数和数据 DLL 的原理是什么?...为什么会大大提升编译速度? 将模块抽离,打包到动态链接库,一个动态链接库可以包含多个模块,当需要导入的模块存在于动态链接库中,不需要编译,直接从动态链接库中获取 HappyPack的构建原理是什么?...,每个子进程还是通过 UglifyJS 去压缩代码,但是变成了并行执行 文件监听的工作原理 采取一种类似轮询的机制,获取当前获取的时间和最后一次保存的最后编辑时间不一致则认为该文件发生了变化,watchOptions.poll...设置 自动刷新浏览器的原理 DevServer默认原理:通过在开发的网页中注入客户端的代码,通过代理客户端去刷新整个页面 iframe 原理:将开发的网页装进一个 iframe 中,通过刷新 iframe
大家好,又见面了,我是你们的朋友全栈君。 文章目录 进程和线程 进程 线程 进程与线程的区别总结 从 JVM 角度说进程和线程之间的关系(重要) 图解进程和线程的关系 程序计数器为什么是私有的?...虚拟机栈:每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。...一句话简单了解堆和方法区 堆和方法区是所有线程共享的资源,其中堆是进程中最大的一块内存,主要用于存放新创建的对象 (所有对象都在这里分配内存),方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据...多进程和多线程区别 多进程:操作系统中同时运行的多个程序 多线程:在同一个进程中同时运行的多个任务 举个例子,多线程下载软件,可以同时运行多个线程,但是通过程序运行的结果发现,每一次结果都不一致。...Java支持多线程,当Java程序执行main方法的时候,就是在执行一个名字叫做main的线程,可以在main方法执行时,开启多个线程A,B,C,多个线程 main,A,B,C同时执行,相互抢夺CPU,
这是我13年前创作和发表在互联网上的文章,这么多年过去了,这篇文章仍然在到处传播。现在贴回Linuxer公众号。...(称为mail box)书写内容以在对方CPU产生中断; (3) 读取在ROM或FLASH的特定单元所烧录的汉字和英文字模。...const在C++语言中则包含了更丰富的含义,而在C语言中仅意味着:"只能读的普通变量",可以称其为"不能改变的变量"(这个说法似乎很拗口,但却最准确的表达了C语言中const的本质),在编译阶段需要的常数仍然只能以...关键字volatile C语言编译器会对用户书写的代码进行优化,譬如如下代码: 很可能被编译器优化为: 但是这样的优化结果可能导致错误,如果I/O空间0x100端口的内容在执行第一次读操作后被其它程序写入新值...CPU字长与存储器位宽不一致处理 在背景篇中提到,本文特意选择了一个与CPU字长不一致的存储芯片,就是为了进行本节的讨论,解决CPU字长与存储器位宽不一致的情况。
领取专属 10元无门槛券
手把手带您无忧上云