阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

使用 C++/CX 开发 Windows Store 应用程序的注意事项

  • 2012-11-02
  • 本文字数:1162 字

    阅读完需:约 4 分钟

《Diving deep into C++ /CX and WinRT》演讲里,Marian Luparu 谈到针对Windows 8 的应用程序的异常处理和性能问题。对于开发者来说,最重要的东西是理解WinRT 和标准C++ 代码之间的边界如何影响异常处理和性能。

异常处理基础

WinRT 没有异常的概念,它的内部使用 HResult。放在 Platform::Exception 的派生类之内的调试信息不会跨越 ABI 边界。通常和异常相关的信息只对调试器可用。

C++ 和 SEH 风格的异常会在跨越 ABI 边界的时候中止进程。这意味着所有 C++ 异常都需要处理,即使这意味着只是把它包装到 Platform::Exception 里。

在捕获 COMException 时一定要检查 HResult。如果你不知道如何处理某个 HResult,可以重新抛出这个异常。类似的,如果你调用一个 COM 方法,它返回一个错误代码,你应该马上把它转换成一个 Exception。

异步和异常处理

在使用并行模式库(PPL)时,让 Lambda 表达式接受一个 task 对象而不是一个单纯的结果是很重要的。比如说,应该使用

复制代码
.then( [](Task<int></int> result) {…} )

而不是

复制代码
.then( [](int result) {…} )

如果你使用第二个版本,一旦遇到异常,整个“then”代码块就会被忽略。(译注:关于 PPL 的异步可以参考《遇见PPL:C++ 的并行和异步》的第四节《async + continuation》)

异步和线程

和C#以及VB 里的async/await 一样,PPL 在处理线程时有点繁琐。如果你在UI 线程里开始一项操作,那么每个continuation(即“then”代码块)也将在UI 线程里执行。如果你想使用线程池,你需要向“then”方法传递 task_continuation_context::use_arbitrary 参数。

C++ 类 vs WinRT 类

一般而言,开发者不应该适用 WinRT 风格的类(ref class),除非他们要和 XAML 交互或者向其他语言提供 WinRT 组件而不得不这样做。WinRT 类比标准 C++ 类慢,而且不能移植,即无法在标准 C++ 应用程序里使用。

另一个改善性能的途径是减少 WinRT 类型和 C++ 类型之间的转换。虽然频繁的跨越 WinRT 边界的通讯会很慢,但没有必要的分配内存和复制数据可能更糟。

一些诸如 StringReference 的包装类或许能够缓解性能问题,但使用的时候必须非常小心。StringReference 是引用计数的,因此,在 StringReference 释放之前,它包装的缓冲内容不能被改变或者删除。这个问题会在 WinRT 持有 StringReference 的一个副本时出现,你无法预料会出现什么结果。Marian Luparu 给出了一个例子:

  1. 创建 StringReference 包装一个缓冲内容。
  2. 调用一个 WinRT 函数并传递这个 StringReference。
  3. 这个 WinRT 函数触发一个 C++ 回调。
  4. 这个回调修改底层的缓冲内容。
  5. 控制权回到 WinRT 函数,但字符串已被意外地修改了。

ArrayReference 也能类似的用来包装 C++ 数组。但由于 WinRT 并不期望 C++ 数组是不可变的,于是出现问题的机会比较少。

查看英文原文: Notes on Writing a Windows Store Apps with C++/CX

2012-11-02 03:452533

评论

发布
暂无评论
发现更多内容

数据结构与算法之时间复杂度与空间复杂度

未见花闻

6月月更

Web3的布局潜力,STI处于价值洼地

股市老人

不止于观测|阿里云可观测技术峰会正式上线

阿里巴巴云原生

阿里云 开源 云原生 可观测峰会 行业实践

Redux之利用 distinct 属性进行性能优化

岛上码农

flutter ios 安卓开发 跨平台应用 6月月更

vue指令-4

小恺

6月月更

Android App首页主流框架搭建

yechaoa

android kotlin 6月月更 material design

外包学生管理系统架构文档

Asura

外包管理系统架构设计

地下地上

架构实战营

数据库每日一题---第6天:删除重复的电子邮箱

知心宝贝

数据库 程序员 前端 后端 6月月更

跨境电商如何通过打好数据底座,实现低成本稳步增长

OceanBase 数据库

跨境电商 oceanbase

《阅读的方法》:怎么找阅读的乐趣?

郭明

读书笔记

3分钟初识网络功能虚拟化NFV

穿过生命散发芬芳

6月月更 NFV

选择数字资产托管人时,要问的 6 个问题

BlockChain先知

GameFi如何破圈,AQUANEE靠真正“P2E”展现风采

EOSdreamer111

在线JSON转XML工具

入门小站

工具

Web3的布局潜力,STI处于价值洼地

EOSdreamer111

在 Vue3 + Element Plus 中生成动态表格,动态修改表格,多级表头,合并单元格

蒋川

低代码 Vue3 组件 表格 Element Plus

Spring Data JPA 极速入门

翊君

spring data 6月月更

架构实战营模块 3 作业

Naoki

架构实战营

RPA能否创造新业态?如何优化组织结构?如何助力疫情中的企业?

王吉伟频道

人工智能 RPA 机器人流程自动化 机器人开发 爱死机

学生管理系统详细架构

intelamd

控制并发线程数的Semaphore

急需上岸的小谢

6月月更

LabVIEW控制Arduino采集DHT11温湿度数值(进阶篇—4)

不脱发的程序猿

单片机 LabVIEW VISA Arduino Uno 采集DHT11温湿度数值

在这些根技术里,读懂华为的“三观”

脑极体

AQUANEE:"P2E "的真正含义

EOSdreamer111

GameFi如何破圈,AQUANEE靠真正“P2E”展现风采

股市老人

linux去掉空行的几种方法

入门小站

Linux

在线摩斯密码在线翻译转换工具

入门小站

工具

市场监管总局出手监督618电商促销节:电商促销节存在哪些诟病

石头IT视角

关于volitile相关知识

北洋

6月月更

java面向对象之多态(向上转型和向下转型)

写代码两年半

面向对象 javase 多态 6月月更

使用C++/CX开发Windows Store应用程序的注意事项_C++_Jonathan Allen_InfoQ精选文章