首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么c,c++不能跨平台,编译器是计算机操作系统上吗,难道说编译器不在c,c++程序里吗?

从事软件开发多年对于C/C++用比较多,可以明确说这两种编程语言也是支持跨平台,肯定还是有很多人问什么是真正意义上跨平台,所谓跨平台就是同一套代码不同操作系统都能直接去运行,这里面涉及到一个很重要问题...,java这门编程语言刚开始流行时候就提到了跨平台功能,windows上运行jar包直接放在linux上也能直接去运行,单纯从C/C++角度出发也是能够实现这种功能,因为其语法实现是相同。...,具体软件核心架构上代码是一致,和平台相关代码还是需要单独去实现,就拿简单线程实现,不同操作系统接口就存在很大差异,所以完全意义上跨平台方面距离高级编程语言还是存在差异。...编译器其实就是一种转化工具,将程序转化成能够运行二进制文件,一般而言C/C++编译器是可以通用,不同操作系统使用不用编译器底层。 ?...编译器是一种工具包集合,内部实现也涉及到C/C++编程,编译通常说编程代码还是存在一定差异,编译器是为代码转化做服务,真正实现跨平台基础部件编译器算是一种,因为不同操作系统或者计算机架构需要具体对应实现

2.3K10

C语言笔记】volatile关键字

,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。...如果键入volatile,则编译器会逐一地进行编译产生相应机器代码产生四条代码)。...编译优化 本次线程内,当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后再取变量值时,就直接从寄存器中取值; 当变量值本线程里改变时,会同时把变量新值copy...到该寄存器中,以便保持一致 当变量因别的线程等而改变了值,该寄存器值不会相应改变,从而造成应用程序读取值和实际变量值不一致; 当该寄存器因别的线程等而改变了值,原变量值不会改变,从而造成应用程序读取值和实际变量值不一致...结果,这段代码可能返回不是你所期望平方值!

71660
您找到你想要的搜索结果了吗?
是的
没有找到

C++编译与链接(2)-浅谈内部链接与外部链接

为什么时会出现无法解析外部符号? 为什么有的内联函数定义需要写在头文件中? 为什么对于模板,声明和定义都要写在一起?...,可以参照之前一篇博客 C++编译与链接(1)-编译与链接过程 编译单元 首先让我们来认识一下编译单元,什么是编译单元呢?...最后让我们回到文章开头处那几个问题吧 为什么时会出现aaa已在bbb中重定义错误?...答:你可能在不同cpp中重复定义了一个具有外部链接函数或变量,链接器链接时找到了多个一样函数或变量定义 为什么时会出现无法解析外部符号?...答:你可能只提供了函数或变量声明,没有提供其定义,或者声明和定义函数原型不一致,链接器没有找到其定义在哪里,所以链接环节出现了无法解析外部符号错误 为什么有的内联函数定义需要写在头文件中呢?

3.8K110

volatile嵌入式系统中用法

多线程应用中被几个任务共享变量 回答不出这个问题的人是不会被雇佣认为这是区分C程序员和嵌入式系统程序员最基本问题。...这段代码目的是用来返指针*ptr指向值平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码: int square(volatile int *ptr)...结果,这段代码可能返不是你所期望平方值!...编译优化 (请高手帮我看看下面的理解) 本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值; 当变量值本线程里改变时...ISR_2中断产生时,main当中调用dosomething函数,但是,由于编译器判断main函数里面没有修改过i,因此 可能只执行一次对从i到某寄存器读操作,然后每次if判断都只使用这个寄存器里面的

1.5K20

Java多线程学习(三)volatile关键字

程序设计中,尤其是C语言、C++、C#和Java语言中,使用volatile关键字声明变量或对象通常具有与优化、多线程相关特殊属性。...通常,volatile关键字用来阻止(伪)编译器认为无法“被代码本身”改变代码(变量/对象)进行优化。...如在C语言中,volatile关键字可以用来提醒编译器它后面所定义变量随时有可能改变,因此编译程序每次需要存储或读取这个变量时候,都会直接从变量地址中读取数。...如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中值,如果这个变量由别的程序更新了的话,将出现不一致现象。...这就可能造成一个线程主存中修改了一个变量值,而另外一个线程还继续使用它在寄存器中变量值拷贝,造成数据不一致

78930

深入Android Runtime: inline优化与字符串

这有点超出正常认知,明明定义了字符串test1,并且只有简单2行代码为什么会crash呢? 现象解释 要解释这种现象,需要了解Android虚拟机字符串处理机制。...这样我们编译产生机器码实际上依赖是早先apk自身Test类代码,而运行时候是执行注入dex中代码,虚拟机解析这个0x4ee2字符串索引时候,会从注入dex字符串常量池中查找,实际上这个...dex字符串数目是非常少,尽管我们代码里面添加了26个新字符串。...总结 我们使用不同jar/dex中新class覆盖旧class时,需要注意,inline场景下,编译器会将一些索引硬编码到机器码中,导致与运行时数据不一致。...归根结底,是编译时依赖与运行时依赖jar/dex不一致引发问题,需要格外注意。

1.8K30

一个由跨平台产生浮点数bug | 有你意想不到结果

问题背景 背景就简单点儿说,当初一个项目 C# 编写,涉及浮点运算,来龙去脉省去,直接看如下代码。(为什么有这个问题产生,是因为当初线上产生了很诡异问题,和本地调试效果不一致。)...-202014162,没问题,难道C#没有产生这样结果?...其实上面这段C++代码不同平台下结果如下: Windows 32/64位下:-202014160 Linux 64位下(CentOS 6 gcc 4.4.7):-202014160 Linux 32...若是用两个double相乘可得正确且合理运算结果。// 就别纠结“正确、合理”这两个词是否恰当了。问题是为何C#下X64和X86结果不一致?...所以大家代码时候得保证实际运行环境/测试环境/开发环境一致性(包括OS架构啊、编译选项等)啊,不然莫名其妙问题会产生(本文就是开发环境与运行环境不一致导致问题,纠结了好久才发现是这个原因);

1.4K30

eclipse遇到问题

开始编译Android程序时必须要有一个匹配虚拟设备,以便呈现出Android运行界面。 要想创建一个AVD,首先打开命令行工具cmd, 进入Android SDKTools目录。...输入下面的命令: 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!

42710

eclipse遇到问题

开始编译Android程序时必须要有一个匹配虚拟设备,以便呈现出Android运行界面。 要想创建一个AVD,首先打开命令行工具cmd, 进入Android SDKTools目录。...输入下面的命令: [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!

1.1K100

微信小程序—setData()使用方法和注意事项

不要把data中任何一项value设为undefined,否则这一项将不能被设置,可能会有潜在问题 使用:先给出代码,wxss没有什么意义就不贴了。...:test02 is not defined; 为什么呢?...setData()注意事项 1、频繁去setData 我们分析过一些案例里,部分小程序会非常频繁(毫秒级)去setData,其导致了两个后果: Android下用户滑动时会感觉到卡顿,操作反馈延迟严重...,因为JS线程一直在编译执行渲染,未能及时将用户操作事件传递到逻辑层,逻辑层亦无法及时将操作处理结果及时传递到视图层; 渲染有出现延时,由于WebViewJS线程一直处于忙碌状态,逻辑层到页面层通信耗时上升...脚本过程,当数据量过大时会增加脚本编译执行时间,占用WebView JS线程。

5.5K10

从Java乱码谈起

背景 实际项目开发中,特别是涉及到中文输入输出时候,大家肯定都被各种乱码问题坑过。如果遇到复杂系统,为了乱码问题折腾几天也不是不可能。 最近项目中,也遇到了一个头疼乱码问题。...我们项目中约定Java代码中凡是涉及到文件输入输出以及控制台输入输出,所有的编码格式都采用UTF-8。 既然是这样,为什么还会出现乱码?这里只能从代码结果着手,一步一步分析和定位。...远程服务上检查“结果报告1”,发现文件格式的确是UTF-8,中文内容也都能正常显示,所以,排除远程服务问题。那么,乱码产生应该是远程服务生成文件及其内容在后续传递过程中发生了编码格式变化。...从这里可以看出,问题不是出现在Java Service本身,而是出现在消息传递过程中。 通过阅读JVM文档资料发现,JVM启动时会设置一个默认字符集编码。...当编译编码格式与源文件编码格式不一致时,很可能出现编译失败问题。 2、Java class文件编码 无论源文件编码格式是什么,Java class文件都是Unicode编码(UTF-16)。

1.4K60

【死磕Java并发】-----分析 ArrayBlockingQueue 构造函数加锁问题

原文出处http://cmsblogs.com/ 『chenssy』 昨天有位小伙伴问我一个 ArrayBlockingQueue 中一个构造函数为何需要加锁,其实这个问题还真没有注意过。...如果不加锁为什么就没法保证 items 可见性呢?这其实是指令重排序问题。 什么是指令重排序?编译器或运行时环境为了优化程序性能而采取对指令进行重新排序执行一种手段。...为什么说指令重排序会影响 items 可见性呢?...其实线程 A 可能还正在执行构造函数中某一个行代码。两个线程不加锁情况对一个不具备线程安全数组同时操作,很有可能会引发线程安全问题。 还有一种解释:缓存一致性。...不加锁前提下,线程 A 构造函数中 items 进行操作,线程 B 通过入队、出队方式对 items 进行操作,这个过程对 items 操作结果有可能只存在各自线程缓存中,并没有写入主存,这样肯定会造成数据不一致情况

1.1K60

面试题系列第3篇:Integer等号判断内幕,你可能不知道?

-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呢?后面我们会讲到。

59930

C语言丨深入理解volatile关键字

编译器认为前面循环半天都是废话,对最后结果毫无影响,因为最终只是将output这个指针赋值为 9,所以编译器最后给你编译编译代码结果相当于: int init(void) { *output...反之如果你不是对此端口反复写操作,而是反复读操作,其结果是一样编译优化后,也许你代码对此地址读操作只做了一次。然而从代码角度看是没有任何问题。...3)多任务环境下各任务间共享标志,应该加volatile; 本次线程内, 当读取一个变量时,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当内存变量或寄存器变量因别的线程等而改变了值...编译器将产生类似下面的代码: int square(volatile int*ptr) { int a,b; a = *ptr; b = *ptr; return a * b; } 由于...结果,这段代码可能返不是你所期望平方值!

78360

去,这么简单条件表达式竟然也有这么多坑

最近,小黑哥一个业务改造中,使用三目运算符重构了业务代码,没想到测试时候竟然发生 NPE 问题。 ?...但是代码并没有对这个方法返回值做任何操作,为何会触发 NPE? 难道是又是自动拆箱导致 NPE 问题? 解答这个问题之前,我们首先复习一下条件表达式。 点赞再看,养成习惯。...nullInteger : simpleInt; 这个案例为开头例子简化版本,运算上述代码,将会发生 NPE 为什么会发发生 NPE 呢?...那么为什么 Java 编译器在编译时会对表达式进行拆箱?难道所有数字类型包装类型都会进行拆箱吗?...但是由于 result是 int 基本数据类型,好家伙,数据类型不一致编译器将会对条件表达式结果进行自动拆箱。由于结果为 null,自动拆箱将报错了。

41220

关键字volatile正确理解和使用!

前言: 今天给大家分享一个知识点,这也是最近在项目中使用过一个c语言知识点,关键字volatile,这个关键字stm32代码里面经常看到,以前对这个关键字理解不是特别深;ok,下面分两期文章来分析这个关键字...ISR_2中断产生时,main函数中调用dosomething函数,但是,由于编译器判断main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器读操作,然后每次if判断都只使用这个寄存器里面的...反之如果你不是对此端口反复写操作,而是反复读操作,其结果是一样编译优化后,也许你代码对此地址读操作只做了一次。然而从代码角度看是没有任何问题。...volatile本质: 编译优化:本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当变量值本线程里改变时...当变量因别的线程等而改变了值,该寄存器值不会相应改变,从而造成应用程序读取值和实际变量值不一致

57630

C++中类型转换

explicit 三、常见面试题 零、前言 本章主要学习C++四种类型转换 一、C语言类型转换 概念及介绍: C语言中,如赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时...,就需要发生类型转化 C语言中两种形式类型转换: 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败 显式类型转化:需要用户自己处理 示例: void Test () {...显式类型转换将所有情况混合在一起,代码不够清晰 因此C++提出了自己类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言转化风格 二、C++强制类型转换 标准C...// 所以非常BUG,下面转换函数指针代码是不可移植,所以不建议这样用 // C++不保证所有的函数指针都被一样使用,所以这样用有时会产生不确定结果 // FUNC...基类必须要有虚函数 对于下行转换,dynamic_cast是安全(当类型不一致时,转换过来是空指针),而static_cast是不安全(当类型不一致时,转换过来是错误意义指针,可能造成踩内存

1.9K20

读书笔记——《深入浅出 Webpack》( 送 XMind导图和电子书)

Devserver 会启动一个 HTTP 服务器用于服务网页请求,同时会帮忙启动 webpack,并接收 webpack 发出文件变更信号,通过 webSocket 协议自动刷新网页做到实时预览 为什么直接修改...什么是动态链接库 windows 系统中,我们会经常看到 .dll 为后缀文件,这种文件叫做动态链接库,一个动态链接库中可以包含为其他模块调用函数和数据 DLL 原理是什么?...为什么会大大提升编译速度? 将模块抽离,打包到动态链接库,一个动态链接库可以包含多个模块,当需要导入模块存在于动态链接库中,不需要编译,直接从动态链接库中获取 HappyPack构建原理是什么?...,每个子进程还是通过 UglifyJS 去压缩代码,但是变成了并行执行 文件监听工作原理 采取一种类似轮询机制,获取当前获取时间和最后一次保存最后编辑时间不一致则认为该文件发生了变化,watchOptions.poll...设置 自动刷新浏览器原理 DevServer默认原理:通过开发网页中注入客户端代码,通过代理客户端去刷新整个页面 iframe 原理:将开发网页装进一个 iframe 中,通过刷新 iframe

89510

进程和线程区别(超详细)

大家好,又见面了,是你们朋友全栈君。 文章目录 进程和线程 进程 线程 进程与线程区别总结 从 JVM 角度说进程和线程之间关系(重要) 图解进程和线程关系 程序计数器为什么是私有的?...虚拟机栈:每个 Java 方法执行时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成过程,就对应着一个栈帧 Java 虚拟机栈中入栈和出栈过程。...一句话简单了解堆和方法区 堆和方法区是所有线程共享资源,其中堆是进程中最大一块内存,主要用于存放新创建对象 (所有对象都在这里分配内存),方法区主要用于存放已被加载类信息、常量、静态变量、即时编译编译代码等数据...多进程和多线程区别 多进程:操作系统中同时运行多个程序 多线程:同一个进程中同时运行多个任务 举个例子,多线程下载软件,可以同时运行多个线程,但是通过程序运行结果发现,每一次结果不一致。...Java支持多线程,当Java程序执行main方法时候,就是执行一个名字叫做main线程,可以main方法执行时,开启多个线程A,B,C,多个线程 main,A,B,C同时执行,相互抢夺CPU,

43120

C语言嵌入式系统编程修炼之内存操作

这是13年前创作和发表互联网上文章,这么多年过去了,这篇文章仍然在到处传播。现在贴回Linuxer公众号。...(称为mail box)书写内容以在对方CPU产生中断; (3) 读取ROM或FLASH特定单元所烧录汉字和英文字模。...constC++语言中则包含了更丰富含义,而在C语言中仅意味着:"只能读普通变量",可以称其为"不能改变变量"(这个说法似乎很拗口,但却最准确表达了C语言中const本质),在编译阶段需要常数仍然只能以...关键字volatile C语言编译器会对用户书写代码进行优化,譬如如下代码: 很可能被编译器优化为: 但是这样优化结果可能导致错误,如果I/O空间0x100端口内容执行第一次读操作后被其它程序写入新值...CPU字长与存储器位宽不一致处理 背景篇中提到,本文特意选择了一个与CPU字长不一致存储芯片,就是为了进行本节讨论,解决CPU字长与存储器位宽不一致情况。

1.6K50
领券