ArraySizeHelper解析

8位可控加减法电路设计 一、设计要求   利用Logisim平台中现有运算部件构建一个8位可控加减法器,可支持八位加减法,利用已经封装全加器和逻辑门进行连接,要求实现相应的输出,判断是否溢出。 二、方案设计 实验原理: [A]补+[B]补 = [A+B]补(mod2^n+1)   公式1        [A-B]补 = [A]补+[-B]补(mod2^n+1)    公式2 FA为全加器,利用全加器实现加减法,难点在于实验减法,对输入的[Y]补各位取反加一即为[-Y]补,利用公式2,就可以将减法转化为加法再利用全加 阅读详情

[ArraySizeHelper解析]

  以下代码用于获取一个数组的元素个数,例如 int table[100],以下宏返回100。

template  < typename  T, size_t  N>
char  (&ArraySizeHelper( const  T (&array)[N]))[N];
#define arraysize(array) (sizeof(ArraySizeHelper(array)))

 [要点]

 1、数组的引用

  T (&)[N] (注意:有个括号)。比如:
  int a[5] = {0};
  int (&ra)[5] = a; 这里ra就是一个对数组a的引用,其这个数组的大小也是5;

 2、返回值为数组引用的函数

  T (& Fun( param_list ) )[N];
  Fun是一个函数,其返回值类型是 T (&)[N];

 3、sizeof()在编译期完成,与运行时无关

  sizeof是C/C++语言中的keyword,不是函数。对其参数里的表达式是不会在执行期去执行的,而只是在编译期去推算整个表达式的最后的类型信息。
  比如: int a = 1; sizeof(a++); cout << a;   // a还是1. 不会是2;
  因为是在编译期完成,编译器只需要类型信息,不需要函数的实现体。所以就可以不用提供定义体。
  下面这个例子可能更能说明这个问题。
  int Fun(); // only declare it without definition
  sizeof( Fun() );  // 这里Fun()函数不会在运行的时候被执行,仅仅是在编译时,编译器需要知道的是:Fun()函数返回值的类型是什么。

 4、模板自动推导在编译期完成

  模板推导是由编译器在编译期(compile time)完成的,而不是在执行期(run time)完成的。

  这个是理解的关键之一。不涉及内存布局分配的问题。编译期间,编译器只关心声明信息(也就是声明式里面所带的类型信息)。模板推导会自动推导模板参数的各种信息(类型,传递过来的数值等)。以下是一个例子:
  template<int x, int y>
  struct sum_
  {
    enum { value = x + y };
  };
  int sum = sum_<3, 4>::value; // sum的值在编译期间就已经确定下来了,不是在执行期间由CPU运算得到。
  这个例子里的模板,仅仅只有数值的传递,没有包含类型。这个可能大家很少见到的。但是模板是支持的。

  例子二:
  template< typename T, size_t N>
  void Fun( T (&)[N] );

  这个模板里既有类型T,又有数值N;模板推导时,是根据Fun的实参来推导得到的。比如:
  int a[5];
  Fun(a); // 编译器经过推导就知道,T=int,N=5。注意这里的N能得到5,是因为Fun的参数声明决定的。这里Fun的参数是:数组引

   5、 sizeof(一个指针)和sizeof(一个数组)有很大区别
  
  int a[5];

  int *p = a;
  int (*pa)[5] = &a;


  // p和pa都是指针,但是指针的类型不同:p的类型是int*;pa的类型是int(*)[5]。


  sizeof(p)       // = 4;
  sizeof(a)       // = 20 = 5*sizeof(int)
  sizeof(*p)     // = sizeof(int) = 4;
  sizeof(pa)    // = 4;
  sizeof(*pa)  // = sizeof(a) = 20;

 6、跨函数类型信息丢失

  C/C++对于数组和指针是明确区分其类型的。数组的信息包括(类型+大小),而指针则没有大小信息。
  在这里附带要说一下,数组经过函数参数传递后,数组的大小信息就丢失了。比如:
  void Fun( int a[5] )
  {   
      int n = sizeof(a);  // n为4,相对于就是sizeof(int*).因为编译器只传递过来了数组的地址,大小信息没有了。
  }


  所以,上面Fun的参数声明里面的数组的具体数字是被忽略掉的。其等价声明式可以是:
  void Fun( int a[10] );
  void Fun( int a[] );
  void Fun( int *a );


  为了需要把大小信息传递到函数里面去,需要额外加一个参数来表示大小信息,这个大小信息需要调用者来提供,并且有调用者来保证大小信息的正确性。
  void Fun( int a[], int size );

 

  原文:http://www.cnblogs.com/tekkaman/archive/2013/08/19/3268518.html

Linux内存压力测试工具【memtester】详且精 对Linux下的压力测试工具memtester有一个比较人性化的概述,以及避坑心得。 阅读详情

相关推荐

模糊综合评价模型

一.引子 1.数学归纳法:同高中知识 2.秃子悖论:秃子悖论 这俩个例子都是类似于“量变引起质变”的道理,而在数学中我们把这类问题的性质叫做“模糊性”,在生活中我们也经常能遇到一些模糊的概念,比如年轻、帅、很少很多… 二.概述 模糊综合评价法是一种基于模糊数学的综合评价方法。该综合评价法根据模糊数学的隶属度理论把定性评价转化为定量评价,即用模糊数学对受到多种因素制约的事物或对象做出一个总体的评价。它具有结果清晰,系统性强的特点,能较好地解决模糊的、难以量化的问题,适合各种非确定性问题的解决。——来自百度百

The__Tyche的博客 2万+

[Chromium阅读点滴]arraysize宏定义与数组元素个数统计

转自:http://blog.sina.com.cn/s/blog_496be0db0100x9cz.html   阅读Chromium代码时,碰到一个宏arraysizeof,定义如下: template typename T, size_t N> char (&ArraySizeHelper(T (&array)[N]))[N]; // That gcc want

4105

Python读取Matlab v7.3数据

文章目录Matlab保存数据Python读取 v7.3 Mat Matlab保存数据 在matlab设置中,常规->MAT文件,选择MATLAB版本7.3或更高版本保存数据。 注意保存数据的文件名为 corre.mat,保存的数据数组为data; 后面python的读取中会用到这两个参数 Python读取 v7.3 Mat 先安装hdf5storage库,再使用以下代码,就可以读取到mat中的数据,注意 import hdf5storage import numpy as np dataDi

weixin_43121914的博客 1081

C++编译期计算数组大小

// 来自<<Effective Modern C++>> P.16 // 计算数组大小 template<typename T, std::size_t N> constexpr std::size_t arraySize(T (&)[N]) noexcept { return N; } int keyVals[]={1,3,7,9,11,22,35}; std::array<int,arraySize(keyVals)> mappedVal

ZZH的博客 933

OS实验xv6 6.S081 开坑

OS实验xv6 6.S081 开坑 终于把xv6 2019 6.S081做完了,网络部分没有写,因为有计网实验了。怎么说呢,xv6的坑有点多,能做完多亏了:和我同学ljj交流,参考RedemptionC老哥的博客(他写的非常详细,遗憾的是,他好像没有写mmap),再者就是参考这位老哥的做法(没有源码,写得不是特别详细,不过有借鉴作用,mmap就是借鉴了他的思想)……废话不多说了,直接开始。 实验指导 首推RedemptionC的博客 这位老哥的个人博客 xv6 6.S081官网(后面的实验都要参考官网

不定期更新系统使用、编程小技巧,哔哩哔哩账号:https://space.bilibili.com/399455629,欢迎关注 4493

Ubuntu服务器通过IPV6端口转发搭建幻兽帕鲁私服实战

本文详细介绍了在Ubuntu服务器上通过IPV6端口转发搭建幻兽帕鲁私服的完整教程。针对只有公网IPV6地址的服务器环境,提供了从硬件检查、端口转发工具配置到游戏服务器安装的全流程解决方案,帮助玩家轻松实现多人联机游戏体验。

weixin_30652491的博客 490

来自chrome的arraysize

<!--lang: cpp--> #arraysize arraysize(arr)宏返回一个数组元素的个数,这个表达式是编译时常量,因此可以用来定义新的数组。如果传给arraysize一个指针,编译时会报错。 ArraySizeHelper是一个返回类型为char[N]的函数,...

chengying2655的博客 141

手把手教你学simulink(16.2)--基于Simulink的高通滤波器(High-Pass Filter)项目

基于Simulink的高通滤波器(High-Pass Filter)项目的详细实例介绍。这个项目将重点放在高通滤波器的设计、实现和仿真上,帮助你理解和应用高通滤波器在信号处理中的作用。

MHD0815的博客 926

《Effective Modern C++》笔记之【类型推断】

概念 or 忠告 The distinction between arguments and parameters is important, because parameters are lvalues, but the arguments with which they are initialized may be rvalues ...

weixin_33955681的博客 276

cartographer实现纯定位

实现纯定位 (1)因为正常的cartographer的建图的map是由cartographer发布的;如下 rostopic info /map Type: nav_msgs/OccupancyGrid Publishers: * /cartographer_occupancy_grid_node 因此需要把map的发布替换成 <node name="map_server" pkg="map_server" type="map_server" args="/home/lx.

Studying…… 5888

OpenClaw实战:拒绝复制粘贴,用 xlsx 技能打通“带公式模板”的月报自动化

本文详解了如何利用 OpenClaw 框架搭载的 xlsx skill,解决 AI 自动化处理“带复杂公式与格式”Excel 月报时极易翻车的业务痛点。针对传统大模型粗暴写入导致模板报废的问题,OpenClaw 创新采用“双核微创”工作流:首先利用 pandas 高效清洗并聚合海量原始明细数据,随后切换至 openpyxl 将计算结果精准注入目标模板,完美保留原有的底色、边框与跨表动态公式。

我有一个梦想 150

计算数组长度小结

结论: C++,计算数组长度使用std::size。 C,使用: int sizeByHandWork = sizeof(arr) / sizeof(arr[0]); 笔记: a. sizeof在不同的编译器之间,C与C++之间,都可能会不同~ b. 问题:sizeof(Type),这里Type如果是函数的参数,怎么写? 回答: sizeof是运算符,由编译器实现。 int,long的长度本来是希望简化底层(不关心字节数,在乎long比int长,即可),但是,有时还是需要关心具体的字节数,不能不关心字节数

Peter的专栏 448

YOLOv8改进,YOLOv8添加DCNv4可变性卷积(windows系统成功编译),全网最详细教程

DCNv4通过两项关键增强解决了其前身DCNv3的局限性:1. 移除空间聚合中的softmax归一化,以增强其动态特性和表达能力;2. 优化内存访问以最小化冗余操作,从而加速计算。这些改进使得DCNv4相比DCNv3显著加快了收敛速度,并且处理速度大幅提升,前向传播速度超过三倍。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 6469

chrome中的arraysize

///http://blog.chinaunix.net/space.php?uid=25909722&do=blog&id=2901495#include using namespace std; template char (&ArraySizeHelper(T (&a

宝宝 1177

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

如何获取C++ Array的大小

参考自chromium的处理方法如下:template <typename T, size_t N> char (&ArraySizeHelper(T (&array)[N]))[N]; #define arraysize(array) (sizeof(ArraySizeHelper(array)))范例:#include <iostream>template <typename T, size_t

wangruitao1991的专栏 2721

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

数组的大小

两种方法 1. chromium中得到数组的大小使用如下宏【1】---- 使用数组的引用 template char (&ArraySizeHelper(T (&array)[N]))[N]; #define arraysize(array) (sizeof(ArraySizeHelper(array))) 2.stdlib.h中_countof()宏【2】----

finding的专栏 1771

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++中获取数组大小的推荐方法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34301307的博客 3257

如何获取c++ Array元素个数

这个问题可简单描述为: 给定一个c++ 数组(如:int x[10]),如何获取它的元素个数?一种显而易见的方法是使用宏(定义1):#define countof( array ) (sizeof( array )/sizeof( array[0] ))我不能说这种方法不正确,因为在给定一个数组,他确实能获取其元素个数。然而,当提供的对象不是数组时,同样的表达式会给你一些不真实的结果。例如,如果你

wangruitao1991的专栏 1万+

数组元素个数 ARRAYSIZE

 ARRAYSIZE

ksrsoft的专栏 1883

C++中获得数组的大小—CountOf实现

在C++中怎样获得数组的大小?   版权:the1(博客名) (博客地址)http://blogs.msdn.com/b/the1/ 翻译:magictong(童磊) 2011年4月 原文地址:http://blogs.msdn.com/b/the1/archive/2004/05/07/128242.aspx            P.S. 之前在一篇文章(http://blog.c

vivi的技术博客 5980

chromium中求定长数组个数的写法

最近在chromium的代码里面发现了一个有意思的求写法数组个数的写法 template <typename T, size_t N> char (&ArraySizeHelper(T (&array)[N]))[N]; #define arraysize(array) (sizeof(ArraySizeHelper(array))) 传统的做法就...

dianmufang3977的博客 200

计算数组的长度

在chromium中有计算数组长度的宏 arraysize template char (&ArraySizeHelper(T (&array)[N]))[N]; // That gcc wants both of these prototypes seems mysterious. VC, for // its part, can't decide which to use (anothe

cwq水域 的专栏 1066

C语言基本语法--数组篇(数组知识剖析)

作为C语言中的一大基础,数组在程序员的编码生涯中,几乎每日都会出现,数组,这一工作之中的利器,它究竟是用来做什么的呢?它会有哪些形式呢?它会不会与前文中函数的调用产生一些奇妙的联系呢?那么接下来进入我们今天的主题--数组(配合本文姊妹篇函数食用效果更佳哦!)

weixin_71594206的博客 2021

由chrome源码中的arraysize想到的

在网上看到一段出自chrome的求数组长度的源代码: templatetypename T, size_t N> char (&ArraySizeHelper(T (&array)[N]))[N]; #define arraysize(array) (sizeof(ArraySizeHelper(array))) google为什么不使用我们一般求数组长度的方法:

Ericdm的专栏 761

编译时计算静态数组大小技巧

这段代码展示了一种经典的C++模板技巧,用于在编译时计算静态数组的大小。通过函数模板ArraySizeHelper对数组类型进行推导,返回一个与数组维度相关的引用类型,结合sizeof运算符实现安全的数组元素计数。相比传统的sizeof(arr)/sizeof(arr[0])方法,该方案具有更好的类型安全性,能防止指针误用。虽然在现代C++中可用constexpr或std::array替代,但这个模板技巧在C++03时代是重要的编译时计算方法,体现了模板元编程的巧妙设计。

yinminsumeng的博客 289

java怎么将字符串根据某个字符将字符串分解,并放入数组中

String sq="a_b_c_d"; String[] chrstr = sq.getSelectors().split("_");

群来群往的博客 5810
上一篇: 设计者的职责
下一篇: 如何使用V2005建立一个BHO组件--响应documentcomplete事件,去除页面中的图片
FirstHope
博客等级 码龄16年 4粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值