zyl910

优化技巧、硬件体系、图像处理、图形学、游戏编程、国际化与文本信息处理。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

随笔分类 -  C12 C++

1 2 下一页

摘要:作者: zyl910 目录一、背景1.1 循环展开简介1.2 测试准备二、在C#中使用2.1 对基础算法做循环展开2.1.1 测试结果:2.2 对 Vector4 版算法做循环展开2.2.1 测试结果:2.3 对 Vector<T> 版算法做循环展开2.3.1 测试结果:2.4 对 Avx版算法做循 阅读全文
posted @ 2022-11-16 23:57 zyl910 阅读(531) 评论(4) 推荐(0) 编辑

摘要:作者: zyl910 一、缘由 在 上一篇文章,介绍了.NET的2种向量类型(Vector4、Vector<T>)。本文来介绍第3种。 .NET Core 3.0 增加了对内在函数(Intrinsics Functions)的支持,并增加了第3种向量类型—— 3. 总位宽固定的向量(Vector o 阅读全文
posted @ 2022-09-18 22:25 zyl910 阅读(547) 评论(2) 推荐(2) 编辑

摘要:作者:zyl910如今,UTF-8字符串的使用频率越来越多了。但是在VC中,不能直接处理UTF-8字符串,得专门去写UTF-8与窄字符串、宽字符串、TCHAR字符串相互转换的代码。不仅费时费力,而且稍不留心就容易造成内存泄露问题。于是我便想专门编写个库来解决UTF-8字符串编码问题。特性——支持 T... 阅读全文
posted @ 2015-07-23 22:41 zyl910 阅读(1641) 评论(0) 推荐(0) 编辑

摘要:作者:zyl910一、缘由 在写一些生成文本的程序时,经常需要使用带缩进的格式化输出的功能。以前为此写过不少类似的函数,可惜它们的可重用性很差。 这是因为——1) C语言的FILE*不支持重定向到自己的缓冲区。2) C++的流机制允许重定向到自己的流缓冲区。可惜这依赖了C++的专有语法,纯C无法用上。 因为上述原因,以前至少得为C与C++编写两套函数集。如果考虑到char/wchat_t/TCHAR,函数集会变得更加臃肿。 于是我决定编写一套“能以相同的代码绑定到 C FILE 或 C++流”的带缩进的格式化输出库。zltabout就是该想法的成果。二、C范例Step 1 定义 ZLT... 阅读全文
posted @ 2013-08-23 23:31 zyl910 阅读(1228) 评论(0) 推荐(0) 编辑

摘要:作者:zyl910 v1.1版的改动如下——将源码上传到github.调整目录结构.添加CMake编译配置文件.使用doxygen规范注释. 文件清单——docs\docs\images\docs\images\examples_tcharall.pngexamples\examples\tcharall\examples\tcharall\makefileexamples\tcharall\tcharall.cexamples\tcharall\tcharall_2003.slnexamples\tcharall\tcharall_2003.vcprojexamples\tcharall.. 阅读全文
posted @ 2013-08-16 21:41 zyl910 阅读(789) 评论(0) 推荐(0) 编辑

摘要:作者:zyl910 前面测试了各种编译器的执行结果,但为什么它们的执行结果是那样呢?这需要仔细分析。VC2005的测试结果比较典型,而且调试跟踪比较方便,于是本篇对VC2005的crt源码进行分析。一、须知 开发工具是VC2005,平台为32位的x86,编译模式为Debug,使用MBCS字符集。二、cout输出窄字符串2.1 已初始化locale “已初始化locale”是指——在输出前执行了初始化locale,即执行了下列语句—— // init. locale::global(locale("")); wcout.imbue(locale("")); 阅读全文
posted @ 2013-01-22 21:13 zyl910 阅读(4917) 评论(0) 推荐(0) 编辑

摘要:作者:zyl910 C++标准为C++标准IO库设计了十分完善的国际化文本处理机制。但在实际使用中,却发现各种编译器对它的支持性存在较大的差异,很多时候无法正确的输出字符。于是我对此进行了深入的调查。一、说明1.1 测试程序 下面有一段很简单的程序,分别利用cout、wcout、printf输出字符串。具体代码为——#include <stdio.h>#include <locale.h>#include <wchar.h>#include <string>#include <iostream>using namespace std; 阅读全文
posted @ 2013-01-20 11:35 zyl910 阅读(37828) 评论(2) 推荐(5) 编辑

摘要:作者:zyl910 用VC2012编译了一个程序,在Windows 8、Windows 7、Windows Vista下都能正常运行。但在Windows XP下运行时,却报错不能运行,具体错误信息为“指定的可执行文件不是有效的 Win32 应用程序”。 在WinXP中装好“Visual C++ Redistributable for Visual Studio 2012 Update 1”。但该程序还是无法运行,仍是报告上述错误。 用eXeScope打开该exe,发现操作系统需求为“6.0”,即只能在Windows Vista或更高的操作系统下运行。 我的VS2012已经升级为“Vis... 阅读全文
posted @ 2013-01-13 21:41 zyl910 阅读(7058) 评论(3) 推荐(1) 编辑

摘要:一、popcnt指令简介 popcnt是“population count”的缩写,该操作一般翻译为“位1计数”,即统计有多少个“为1的位”。例如,十六进制数“FF”,它有8个为1的位,即“popcnt(0xFF) = 8”。popcnt主要应用在密码学与通信安全,例如计算汉明重量(Hamming weight)。 x86体系最初是没有硬件popcnt指令的,只能靠软件计算。 2008年底,Intel发布了Nehalem架构的处理器,增加了SSE4.2指令集,其中就有硬件popcnt指令。虽然它名义上是属于SSE4.2指令集,但它并不使用XMM寄存器(SSE的128位寄存器),而是使用G... 阅读全文
posted @ 2012-11-02 23:00 zyl910 阅读(11188) 评论(0) 推荐(4) 编辑

摘要:作者:zyl910。 之前的ccpuid V1.02的mmx/sse指令可用性检查存在缺陷。现在的V1.03版改进了mmx/sse指令可用性检查,使用signal、setjmp,能够支持纯C程序。修正了AVX检查Bug。增加多文件链接ccpuid的测试例程。一、更新说明1.1 改进mmx/sse指令可用性检查1.1.1 问题背景 以前是使用结构化异常处理来确认当前环境是否能运行mmx/sse指令的。该方法存在两个问题。 首先,仅有C++支持结构化异常处理,而纯C是不支持的。所以在V1.02版中,是根据__cplusplus宏来做条件编译的。造成仅有C++版支持指令可用性检查,而纯C版没有... 阅读全文
posted @ 2012-10-13 00:01 zyl910 阅读(4824) 评论(1) 推荐(2) 编辑

摘要:新版本——http://www.cnblogs.com/zyl910/archive/2012/10/13/ccpuid_v103.html作者:zyl910。 之前的ccpuid V1.01版只支持Windows和Linux平台。现在的V1.02版增加对Mac OS X平台的支持,还做了这些改进——支持纯C、增加CPUF常数、x86平台判断。一、更新说明1.1 支持Mac OS X平台 之前我发现了Mac OS X中的“/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/li.. 阅读全文
posted @ 2012-09-29 23:34 zyl910 阅读(8512) 评论(0) 推荐(0) 编辑

摘要:作者:zyl910。 这是一个小工具,枚举ActiveX控件的 CLSID 和 implemented/required CATIDs。可用来帮助分析ActiveX控件部署问题。一、代码 全部代码——View Code #include <stddef.h>#include <stdio.h>#include <tchar.h>#include <locale.h> #include <Windows.h>#include <crtdbg.h>#include <comcat.h>#include <at 阅读全文
posted @ 2012-09-25 16:44 zyl910 阅读(1396) 评论(0) 推荐(0) 编辑

摘要:作者:zyl910。 之前的ccpuid V1.00版(http://www.cnblogs.com/zyl910/archive/2012/07/11/ccpuid.html)只支持VC。 现在的V1.01版支持GCC,不仅兼容32位/64位Linux下的GCC,还兼容Windows下的MinGW、MinGW-w64、TDM-GCC等。可以自由的编译为Windows下、或Linux下的程序。一、更新说明 主要的改进有——1. 支持GCC。2. 使用getcpuid/getcpuidex函数来获取CPUID信息。3. 使用C99标准整数类型uint32_t,提高可移植性。二、全部代码2.... 阅读全文
posted @ 2012-08-22 23:01 zyl910 阅读(4262) 评论(0) 推荐(1) 编辑

摘要:作者:zyl910 在编写跨平台的程序时,我们经常使用预定义宏来检测编译环境。虽然编译器的手册中有预处理宏的介绍,但是不够详细,而且还有很多宏没有介绍。于是,我编写了一个小程序,显示常见C/C++编译器的编译器的预定义宏。一、心得 最直接的办法是逐个逐个的用#ifdef判断宏是否存在,然后再printf显示其内容。可是预定义宏有些是整数、有些是字符串,还有些是关键字不能直接用printf输出,用起来挺麻烦的。 在网上发现一种不错办法,出自《关于CPP的预定义宏:unix、linux、i386、i586,大家中过招吗?》4楼“太平绅士”——View Code #include <stdio 阅读全文
posted @ 2012-08-02 18:24 zyl910 阅读(12153) 评论(0) 推荐(3) 编辑

摘要:作者:zyl910 在不同平台上开发C/C++程序时,为了避免源码文件乱码,得采用UTF-8编码来存储源码文件。但是很多编译器对UTF-8源码文件兼容性不佳,于是我做了一些测试,分析了最佳保存方案。一、测试程序 为了测试编译器对UTF-8源码文件兼容性,我编写了这样的一个测试程序——//#if _MSC_VER >= 1600 // VC2010//#pragma execution_character_set("utf-8")//#endif#include <stdio.h>#include <locale.h>#include <s 阅读全文
posted @ 2012-07-26 23:56 zyl910 阅读(16613) 评论(5) 推荐(3) 编辑

摘要:作者:zyl910 关于获取各种CPUID信息,我之前积累了不少代码,现在决定将它们封装在一个模块中,方便代码复用。 其次,前面只是介绍了CPUID的一些常用功能,而Intel、AMD的手册中定义了大量的CPUID功能。所以我希望有一个程序能按照功能号顺序,依次显示所有的CPUID信息。这样就能很方便的与Intel、AMD的手册进行对照,有助于学习与理解。一、模块设计 最初方案是 想将所有功能全部放在一个“ccpuid.h”头文件中,这样用起来会比较方便。 但是考虑到全局变量等问题,以及需要编写CCPUID类。所以最终决定按照常规做法,分解为头文件与实现文件。 对于原先所写的宏定义、... 阅读全文
posted @ 2012-07-11 16:17 zyl910 阅读(1096) 评论(0) 推荐(0) 编辑

摘要:网上有很多介绍VC与GCC预定义宏的帖子,例如《C\C++宏大全》。 而对于Intel C++编译器的预定义宏,似乎没人介绍。 我Google了很久,发现Intel官网上有,但是很奇怪,很多链接都失效了,报告404错误。反复调整搜索关键字,一个一个的尝试链接,最后终于找到了有效的页面了。为了怕以后链接失效,赶紧记录下载。 该手册的名字是《Intel® C++ Compiler XE 12.1 User and Reference Guides》,分别有Windows版和Linux版——Windows:http://software.intel.com/sites/products/d 阅读全文
posted @ 2012-07-06 11:03 zyl910 阅读(6438) 评论(0) 推荐(0) 编辑

摘要:从2011年的Sandy Bridge微架构处理器开始,现在支持AVX系列指令集的处理器越来越多了。本文探讨如何用VC编写检测AVX系列指令集的程序,并利用了先前的CPUIDFIELD方案。一、AVX系列指令集简介 SSE5 指令:SSE5 是一个纸面上的指令集,并没有最终实现,AMD 在 2007 年 8 月公布 SSE5 指令集规范,在 2009 年 5 月 AMD 推出了 XOP,FMA4 以及 CVT16 来取代 SSE5 指令。 AVX 指令:2008 年 3 月 Intel 发布了 AVX(Advanced Vector Extensions)指令集规范,首次在 Sandy B.. 阅读全文
posted @ 2012-07-04 16:01 zyl910 阅读(11245) 评论(0) 推荐(0) 编辑

摘要:除了基本的MMX和SSE系列指令集外,x86体系还有其他扩展指令集,例如SSE4A、AES、PCLMULQDQ等,它们也可以利用CPUID指令来检测。但是,这些指令集细碎杂多。如果像以前那样分别编写检测函数的话,那工作量太大,不值得。而且大量的函数名也会给使用带来麻烦。于是文篇探讨如何设计一套通用的检测方案。零、指令简介 SSE4A指令:是AMD提出的,最早出现在2007年的K10微架构的处理器上。它针对Intel的SSE4指令集修改而来,去除其中对I64优化的指令,保留图形、影音编码、3D运算、游戏等多媒体指令,并完全兼容。 AES指令:是Intel提出的,最早出现在2010年的West.. 阅读全文
posted @ 2012-06-29 14:11 zyl910 阅读(4000) 评论(0) 推荐(0) 编辑

摘要:以前我写了一篇《[VC6] 检查MMX和SSE系列指令集的支持级别(最高SSE4.2)》(http://www.cnblogs.com/zyl910/archive/2012/03/01/checksimd.html)。现在发现该方法存在两点缺陷——1.不支持64位,因为VC的64位程序不支持内嵌汇编;2.没有区分硬件支持与操作系统支持。 怎么解决这两点缺陷呢? 对于第1点,可以利用Intrinsics函数来兼容32位和64位。为了更方便的使用CPUID指令,可以利用《如何在各个版本的VC及64位下使用CPUID指令》(http://www.cnblogs.com/zyl910/arc... 阅读全文
posted @ 2012-05-25 22:22 zyl910 阅读(4800) 评论(0) 推荐(1) 编辑

1 2 下一页