c语言 手动实现sizeof,sizeof究竟是怎样实现的?

sizeof,是在编译的时候,查找符号表,判断类型,然后根据基础类型来取值的,如果是struct则是看类型声明符号表来判定,如果字符串则是通过常

量表来判断,具体可以参考编译原理的符号表管理章节,一般都有讲,如果没讲,不要读这本书,呵呵

关于sizeof的一般性的问题,相信大家已经见过很多了。

本文讨论的是一些不常见的细节。

关于sizeof的更多细节:

1、sizeof(i++)之后,i的值会怎样?答案是不变。记得大一初学C语言时想研究一下sizeof与函数有什么区别,得到的结果只

是一些语法上的差别;学了汇编之后看看编译器生成的代码,才发现sizeof在编译时直接给定了一个常值,而非在运行时求值。进而又分析过

sizeof(表达式)的结果,清楚了类型提升原理。但我之前没有注意过表达式中出现副作用的问题,于是在sizeof(i++)的问题上犹豫了。现在经

过查阅资料和实验,结论是:sizeof在大多数情况下是编译时定值的,表达式中的任何副作用(包括有副作用的运算符、函数调用等)都不会发生。这里说

“大多数情况”,排除了针对C99的新特性——不定长数组(variable length

array)的特例。参考这篇文章(http://rednaxelafx.javaeye.com/blog/225909),如果sizeof运算符

的参数是一个不定长数组,则该需要在运行时计算数组长度。

2、sizeof('a')的结果是多少?这个要看是在C中还是C++中了。根据标准的规定,在C的算术类型提升时,字符常量'a'自动提

升为整型,故结果是4(对于32位机器);而在C++中则有字符常量的规定,'a'就是一个单字节的字符常量,故结果是1。我这样理解:C强调了char

的“数”属性,而C++强调了char的“字符”属性。

3、sizeof('ab')的结果又是多少?'ab'这种语法我以前没有注意到。经查,这叫做“多字节字符常量”(multi-

character character

constant),它限制在单引号中包含2至4个字节。根据标准,多字节字符常量的语义由编译器的实现决定。在我测试的gcc

4.0和VS2008中,如果int a = 'abcd',则a == 0x61626364。sizeof('ab') ==

sizeof('abc') == sizeof('abcd') == 4。

4、那么sizeof(L'a')呢?虽然wchar_t是在源代码级可移植的宽字符,但其大小依赖于操作系统或编译器的定义。独立出现的

wchar_t常量并不会像char常量那样做算术提升,所以sizeof(L'a')就等于sizeof(wchar_t)。在我在32位

Windows和Linux平台下分别为2和4。

5、至于sizeof(L'ab')、sizeof(L'中')、sizeof(L'中国')又会如何?宽字符常量的单引号中出现多个字节

构成的单个字符(如L'中')是合法的,对它取sizeof,结果等于具体实现下的sizeof(wchar_t)。但出现多个字节构成的多个字符(如

L'ab'、L'中国')则是没有定义的,编译器可能报错,也可能给出不同的实现。在我测试的gcc4.0和VS2008中,L'abcd'分别返回了

0x64和0x61。对它们取sizeof,结果等于具体实现下的sizeof(wchar_t),但注意这是标准未定义的,不应该确信。

另外,看到的关于sizeof的两个精巧的宏实现。

非数组的sizeof:

#defne _sizeof(T) ( (size_t)((T*)0 + 1))

数组的sizeof:

#define array_sizeof(T)   ( (size_t)(&T+1)  - (size_t)(&T)

)

原理就是c/c++中的指针运算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python bytes转换为string_Python3 中 bytes 和 string 之间的互相转换

Table of ContentsPython3 最重要的新特性大概要算是对文本(text)和二进制数据(binary data)作了更为清晰的区分。文本总是 Unicode,由 str 类型表示。二进制数据则由 bytes 类型表示。那么什么是 bytes、什么是 Unicode 呢?首先计算机能存储的唯一东西就…

c语言中如何打出草花图案,C语言程序设计程设计题目1.doc

C语言程序设计程设计题目1通信工程10级C语言课程设计任务书各位同学可以自由组合,不超过以下题目中所规定的人数进行选题(不允许重复选题)。辅导时间:另定地点:软件中心(语音楼8楼)答辩检查时间:18周星期五上午8:00起1…

android 字体像素转换工具类_android工具类,转换大小写,保留小数点处理方法

import java.text.DecimalFormat;import java.util.Scanner;/*** 金额转换** author Administrator*/public class ConvertMoney {// 大写数字private final static String[] STR_NUMBER {"零", "壹", "贰", "叁", "肆", &…

android 百度地图开发 怎么减小包的大小,最新的百度地图Android开发包中,如何隐藏右下角的放大缩小控件...

2016-02-24 回答// 隐藏缩放控件int childcount mmapview.getchildcount();view zoom null;for (int i 0; i < childcount; i) {view child mmapview.getchildat(i);if (child instanceof zoomcontrols) {zoom child;break;}}zoom.setvisibility(view.gone);// 隐藏比例…

python换源还是不行_浅析Python3 pip换源问题

pip安装源背景#在实际开发中, 可能要大量使用第三方模块(包), 更换至国内下载源, 可大幅提升下载速度"""1、采用国内源&#xff0c;加速下载模块的速度2、常用pip源&#xff1a;-- 豆瓣&#xff1a;https://pypi.douban.com/simple-- 阿里&#xff1a;https://m…

vs2017 cmake android,CMake构建VS2017工程

1 安装VS2017/cmake2 工程开发3 生成VS2017工程4 参考资料1 安装VS2017/cmake软件安装&#xff1a;Visual Studio官网下载Visual Studio Community 2017,该版本是适用于学生、开源和个人开发人员的功能完备的免费IDE。Visual Studio Community 2017还可以免费安装Incredibuild&…

发明导诊机器人团队_潮阳这个医院来了一位智能导诊机器人!

(原标题&#xff1a;大峰医院来了一位智能导诊机器人&#xff0c;镇街卫生院服务配套更完善&#xff0c;我区就医环境变化这么大……)区卫健系统各医疗单位严格按照全国文明城市实地考察场所创建标准&#xff0c;对标对表落实各项措施及制度&#xff0c;就医环境和医疗服务水平…

android是语言吗,android – 内容描述应该是多种语言吗?

你的第一个问题没有完美的答案.但是,由于您正在开发多语言应用程序,我建议您为您关心的语言进行翻译.它可能取决于您的应用程序的目标用户.例如,如果您的目标用户是韩语,那么如果您可以为他们翻译会更好,不是吗&#xff1f;对于第二个问题,如果您的用户使用您未提供的语言,它将…

android按钮变输入框动画,AnimShopButton 仿饿了么加入购物车旋转控件 - 自带闪转腾挪动画 的按钮。自带海量可定制 UI 属性。在 Re @codeKK Android开源站...

A shopping cart button with a telescopic displacement rotation animation ...一个仿饿了么 带伸缩位移旋转动画的购物车按钮注意&#xff0c;本控件非继承自ViewGroup,而是纯自定义 View&#xff0c;实现的仿饿了么加入购物车控件&#xff0c;自带闪转腾挪动画的按钮。图 1…

表格外粗内细怎么设置_金游艇复刻机芯-N厂灰游艇价格 | 复刻表评测

GM厂劳力游艇名仕型系列&#xff0c;官方2019年度机芯搭配全线更新为cal. 3235机芯&#xff0c;同时&#xff0c;在表盘六点位上有劳力皇冠的防伪LOGO。GM厂经历一年&#xff0c;在3135的基础上开发一体出3235机芯&#xff0c;功能与结构等完美还原于正品机芯。而且&#xff0c…

html中输出语句怎么写,javascript怎么输出?

JavaScript怎么输出&#xff1f;输出方式有哪些&#xff1f;下面本篇文章就给大家介绍JavaScript的几种输出方式&#xff0c;希望对大家有所帮助。方法1&#xff1a;使用window.alert()进行输出window.alert()方法用于显示带有一条指定消息和一个【确认】 按钮的警告框。代码示…

cron每2天跑一次_直购直测,进口新极光每2年或34000公里才需要保养一次?

我们选择以第 2 代揽胜极光P200 R-Dynamic S 车型&#xff0c;作为执行 [ 直购直测 ] 单元的第 12 辆车款&#xff0c;而在先前包含购车篇说明选择原因、油耗测试篇带大家一探具备轻油电技术的极光 P200 R-Dynamic S 油耗表现后&#xff0c;本次则是要带大家看看揽胜极光回厂定…

html5的高级选择器,web@css高级选择器(after,befor用法),基本css样式

1.高阶选择器:子代后代&#xff0c;相邻通用兄弟&#xff0c;交集并集&#xff0c;属性&#xff0c;伪类&#xff0c;伪元素子代后代选择器div>p{} div p{}相邻通用兄弟divp{} div~p{}理解&#xff1a;div同学的同桌p div同学的【同学(有p的)】交集并集选择器div,p di…

rrt算法流程图_RRT算法移动机器人路径规划(快速扩展随机树).pdf

( )第 34 卷 第 5期 南京理工大学学报 自然科学版 Vo l. 34 No. 520 10年 10 月 Journal of N anj ing Un iversity of Science and Techno logy (N atu ral Science) O ct. 20 10基于模糊滚动 RRT算法的移动机器人路径规划康  亮 ,赵春霞 ,郭剑辉(南京理工大学 计算机科学与技…

yui3 html属性,YUI Rich Editor + invalidHTML + style

问题I am trying to insert an inline style tag into the editor content. When I call saveHTML it strips out the style block when Im in rich editor view. I have tried changing the style property of invalidHTML to false, but it still seems to strip the style b…

hhkb mac设置_把 HHKB 放在 MacBook 上使用的解决方案

我现在用的是一台 15 寸带 Touch Bar 的 MacBook Pro &#x1f9d1;&#x1f3fb;‍&#x1f4bb;。我一直是把 HHKB 键盘架在 MacBook 键盘 ⌨️ 上面使用的&#xff0c;就像下面这样。HHKB 放在 MacBook 上尺寸刚刚好&#xff0c;缺点就是挡住了 Touch Bar&#xff0c;不过对…

五年一贯制专转本计算机网络真题,金陵科技学院2017年五年一贯制专转本考试大纲(计算机网络基础)...

一、参考书目&#xff1a;《计算机网络技术与应用(第2版)》&#xff0c;段标、张玲主编&#xff0c;电子工业出版社&#xff0c;出版时间&#xff1a;2011年12月。二、考试形式&#xff1a;闭卷&#xff0c;考试时间90分钟三、考试内容和要求(一)考试要求1.计算机网络理论知识●…

带电检测必要性_接地电阻检测分析的必要性

无论是为保障电力系统正常运行所需要设置的接地&#xff0c;如三相系统的中性点接地等&#xff1b;还是为了人身安全将电气设备的金属外壳等接地&#xff0c;保证金属外壳固定为地电位&#xff0c;一旦设备绝缘损坏使外壳带电时不致产生危险的电位升高&#xff0c;引起工作人员…

html中basefont标签,HTML的basefont标签

HTML 标签只有 Internet Explorer 支持 标签。应该避免使用该标签。定义和用法 ( 推荐学习&#xff1a;html教程 )标签定义基准字体。该标签可以为文档中的所有文本定义默认字体颜色、字体大小和字体系列。HTML 与 XHTML 之间的差异在 HTML 4.01 中&#xff0c;不赞成使用 ba…

python隐式等待_selenium中隐式等待和显示等待的区别

Selenium显示等待和隐式等待的区别1、selenium的显示等待原理&#xff1a;显示等待&#xff0c;就是明确的要等到某个元素的出现或者是某个元素的可点击等条件&#xff0c;等不到&#xff0c;就一直等&#xff0c;除非在规定的时间之内都没找到&#xff0c;那么久跳出Exception…