本网页所有文字内容由 imapbox邮箱云存储,邮箱网盘, iurlBox网页地址收藏管理器 下载并得到。
ImapBox 邮箱网盘 工具地址: https://www.imapbox.com/download/ImapBox.5.5.1_Build20141205_CHS_Bit32.exe
PC6下载站地址:PC6下载站分流下载
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox 网页视频 工具地址: https://www.imapbox.com/download/ImovieBox4.7.0_Build20141115_CHS.exe
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
SDL2.0例子程序中的 testplatform项目代码分析 ,针对不同的平台 检测字节序 CPU支持的指令集 类型宽度 以及断言
简介
代码+注释
#include <stdio.h> #include "SDL.h" #include "SDL_endian.h" #include "SDL_cpuinfo.h" #include "SDL_assert.h" /* * 该例子代码检测运行平台 */ //判断变量占用字节数 是否等于 hardcodetype static int badsize(size_t sizeoftype, size_t hardcodetype) { return sizeoftype != hardcodetype; } //检测系统是否出现错误类型 貌似用处不大这段坑爹代码 //如果平台类型错误 返回1 否则返回 0 int TestTypes(SDL_bool verbose) { int error = 0; //如果Uint8占用一个字节 if (badsize(sizeof(Uint8), 1)) { //如果Uint8不等于1那么输出 实际占用尺寸 if (verbose) SDL_Log("sizeof(Uint8) != 1, instead = %u/n", (unsigned int)sizeof(Uint8)); //错误次数++ ++error; } //如如下类似 上述 if (badsize(sizeof(Uint16), 2)) { if (verbose) SDL_Log("sizeof(Uint16) != 2, instead = %u/n", (unsigned int)sizeof(Uint16)); ++error; } if (badsize(sizeof(Uint32), 4)) { if (verbose) SDL_Log("sizeof(Uint32) != 4, instead = %u/n", (unsigned int)sizeof(Uint32)); ++error; } if (badsize(sizeof(Uint64), 8)) { if (verbose) SDL_Log("sizeof(Uint64) != 8, instead = %u/n", (unsigned int)sizeof(Uint64)); ++error; } if (verbose && !error) SDL_Log("All data types are the expected size./n"); return (error ? 1 : 0); } //测试尾数 也就是机器的字节序 //windows默认是小端模式 //也就是 低位先存 原因是 堆栈是 由高地址向低地址扩展 int TestEndian(SDL_bool verbose) { int error = 0; Uint16 value = 0x1234; int real_byteorder; Uint16 value16 = 0xCDAB; Uint16 swapped16 = 0xABCD; Uint32 value32 = 0xEFBEADDE; Uint32 swapped32 = 0xDEADBEEF; Uint64 value64, swapped64; //定义64位置 也就是 0x00000000EFBEADDE value64 = 0xEFBEADDE; //右移动32位 也就是四个字节 value64 <<= 32; //将低位置为0xCDAB3412 value64 |= 0xCDAB3412; //如下操作和value64雷同 swapped64 = 0x1234ABCD; swapped64 <<= 32; swapped64 |= 0xDEADBEEF; //打印机器字节序 是大端模式还是小端模式 if (verbose) { SDL_Log("Detected a %s endian machine./n", (SDL_BYTEORDER == SDL_LIL_ENDIAN) ? "little" : "big"); } //我们自己判断字节序 将value转换为 char类型之后 由于数据丢失 变成了0x34 在windows下低位先存 //所以 左移4位后变成了0x3了 也就是小端口模式 if ((*((char *)&value) >> 4) == 0x1) { real_byteorder = SDL_BIG_ENDIAN; } else { real_byteorder = SDL_LIL_ENDIAN; } //如果我们分析的 真正的字节序不等于 SDL给出的字节序 那么 输出真正的字节序 error++ if (real_byteorder != SDL_BYTEORDER) { if (verbose) { SDL_Log("Actually a %s endian machine!/n", (real_byteorder == SDL_LIL_ENDIAN) ? "little" : "big"); } ++error; } //交换字节序 输出 if (verbose) { SDL_Log("Value 16 = 0x%X, swapped = 0x%X/n", value16, SDL_Swap16(value16)); } //如果交换后的值不等于 0xABCD if (SDL_Swap16(value16) != swapped16) { if (verbose) { SDL_Log("16 bit value swapped incorrectly!/n"); } ++error; } //交换32位高度字节序 if (verbose) { SDL_Log("Value 32 = 0x%X, swapped = 0x%X/n", value32, SDL_Swap32(value32)); } if (SDL_Swap32(value32) != swapped32) { if (verbose) { SDL_Log("32 bit value swapped incorrectly!/n"); } ++error; } if (verbose) { //如果是微软的编译器 也就是VC下 打印出64位的交换字节序之后的值 #ifdef _MSC_VER SDL_Log("Value 64 = 0x%I64X, swapped = 0x%I64X/n", value64, SDL_Swap64(value64)); #else //如果是其他编译器 那么 64位置 ULONG 就需要定义为 unsigned long long 来代表 64位无符号 Integer SDL_Log("Value 64 = 0x%llX, swapped = 0x%llX/n", (unsigned long long) value64, (unsigned long long) SDL_Swap64(value64)); #endif } //判断交换后的值是否等于 0x1234ABCDDEADBEEF; if (SDL_Swap64(value64) != swapped64) { if (verbose) { SDL_Log("64 bit value swapped incorrectly!/n"); } ++error; } //返回错误状态 return (error ? 1 : 0); } //检测CPU 的特性 int TestCPUInfo(SDL_bool verbose) { if (verbose) { //打印CPU数量 SDL_Log("CPU count: %d/n", SDL_GetCPUCount()); //获取CPU Cache LIne的大小 即CPU 一次从主存Copy的内存大小 SDL_Log("CPU cache line size: %d/n", SDL_GetCPUCacheLineSize()); //CPU是否支持RDTSC指令 读取时间标签计数器 SDL_Log("RDTSC %s/n", SDL_HasRDTSC() ? "detected" : "not detected"); ///cpu 是否支持 Altivec AltiVec提供了32个128比特向量暂存器,与之相比,SSE和SSE2只提供了8个 SDL_Log("AltiVec %s/n", SDL_HasAltiVec() ? "detected" : "not detected"); //cpu是否支持 MMX指令 SDL_Log("MMX %s/n", SDL_HasMMX() ? "detected" : "not detected"); //CPU是否支持SIMD , 由AMD开发的一套SIMD多媒体指令集,支持单精度浮点数的矢量运算,用于增强x86架构的计算机在三维图像处理上的性能 SDL_Log("3DNow! %s/n", SDL_Has3DNow() ? "detected" : "not detected"); //cpu是否支持SSE SDL_Log("SSE %s/n", SDL_HasSSE() ? "detected" : "not detected"); //SSE2是否支持 如下都是判断CPU是否支持一下加速指令集 SDL_Log("SSE2 %s/n", SDL_HasSSE2() ? "detected" : "not detected"); SDL_Log("SSE3 %s/n", SDL_HasSSE3() ? "detected" : "not detected"); SDL_Log("SSE4.1 %s/n", SDL_HasSSE41() ? "detected" : "not detected"); SDL_Log("SSE4.2 %s/n", SDL_HasSSE42() ? "detected" : "not detected"); SDL_Log("AVX %s/n", SDL_HasAVX() ? "detected" : "not detected"); //获取系统RAM大小 也就是内存大小 SDL_Log("System RAM %d MB/n", SDL_GetSystemRAM()); } return (0); } int TestAssertions(SDL_bool verbose) { //sdl断言 SDL_assert(0); SDL_assert_release(1); SDL_assert_paranoid(1); SDL_assert(0 || 1); SDL_assert_release(0 || 1); SDL_assert_paranoid(0 || 1); #if 0 /* enable this to test assertion failures. */ SDL_assert_release(1 == 2); SDL_assert_release(5 < 4); SDL_assert_release(0 && "This is a test"); #endif { //获取所有的断言 链表 在调用SDL_GetAssertionReport 之前 /************************************************************************/ /* typedef struct SDL_assert_data { int always_ignore; unsigned int trigger_count; const char *condition; const char *filename; int linenum; const char *function; const struct SDL_assert_data *next; } SDL_assert_data; */ /************************************************************************/ const SDL_assert_data *item = SDL_GetAssertionReport(); //我们发现就是取出所有的 断言结果 输出 while (item) { SDL_Log("'%s', %s (%s:%d), triggered %u times, always ignore: %s./n", item->condition, item->function, item->filename, item->linenum, item->trigger_count, item->always_ignore ? "yes" : "no"); item = item->next; } } return (0); } int main(int argc, char *argv[]) { SDL_bool verbose = SDL_TRUE; int status = 0; /* 设置特定日志的优先级 这里是应用程序日志 */ SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO); //如果参数1= -q 那么设置 verbose=faslse if (argv[1] && (SDL_strcmp(argv[1], "-q") == 0)) { verbose = SDL_TRUE; } if (verbose) { SDL_Log("This system is running %s/n", SDL_GetPlatform()); } //测试变量尺寸 status += TestTypes(verbose); //测试尾数 也就是测试机器的字节序 status += TestEndian(verbose); //测试CPU信息 status += TestCPUInfo(verbose); //测试断言 status += TestAssertions(verbose); return status; }
<img src="https://img.blog.csdn.net/20141220011403769?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVlNzYwMzgzNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
阅读和此文章类似的: 程序员专区