有没有办法配置VS2010为不同的解决方案使用不同的配色方案?在Macintosh上,在1990年代,我可以为文档添加wctb资源,这样它们就会以不同的配色方案打开.这样可以更容易地找到正确的单击窗口,还有助于避免在错误的文档中意外键入内容(如果打开了几个类似的文档,则很容易做到).有什么好方法可以在VS2010中实现类似的效果吗?我主要想改变文本背景颜色和窗口背景颜色.
当我使用vs2005和vbEx2005时,我可以将vbEx设置为一个方案而将vs设置为另一个方案,但是现在我将vs2010用于所有内容.有没有什么好方法可以在每个项目的基础上设置颜色?
C标准指定小于的整数操作数int
将int
在对它们执行任何算术运算之前被提升.因此,对两个小于的无符号值的运算int
将使用带符号而非无符号数学执行.如果确保使用无符号数学运算对32位操作数进行操作很重要(例如,乘以两个数字,其乘积可能超过2⁶3)将使用uint_fast32_t
任何标准保证的类型,以产生无符号语义而没有任何未定义的行为?如果没有,是否有任何其他无符号类型,保证至少32位,至少大到int
?
许多问题/答案表明,如果一个类对象有一个final
字段,并且在构造期间没有任何对它的引用暴露给任何其他线程,那么一旦构造函数完成,所有线程都保证看到写入该字段的值.他们还指出,在一个final
字段中存储对外部线程从未访问过的可变对象的引用将确保在存储之前对对象进行的所有突变都将在通过访问对象的所有线程上可见.场.不幸的是,两种保证都不适用于非final
字段的写入.
然而,我没有看到答案的问题是:如果一个类的语义是一个字段不能final
,但是一个人希望确保字段的"发布"和由此识别的对象,那么效率最高的是什么这样做的方式?举个例子,考虑一下
class ShareableDataHolder<T>
{
Object data; // Always identifies either a T or a SharedDataHolder<T>
}
private class SharedDataHolder<T> extends ShareableDataHolder<T>
{
Object data; // Always identifies either a T or a lower-numbered SharedDataHolder<T>
final long seq; // Immutable; necessarily unique
}
Run Code Online (Sandbox Code Playgroud)
目的是data
最初将直接识别数据对象,但可以在任何时候合法地更改它以识别SharedDataHolder<T>
直接或间接封装等效数据对象的数据对象.假设所有代码都被编写为正常工作(尽管不一定非常有效),如果任何读取data
可能会随意返回任何曾写入的值data
,但如果读取则可能会失败null
.
声明volatile Object data
在语义上是正确的,但可能会在每次后续访问该字段时增加额外费用.在最初设置字段后输入虚拟锁会起作用,但会不必要地慢.有一个虚拟final
字段,该对象设置为识别自己似乎应该工作; 虽然从技术上讲,我认为可能需要通过其他字段完成对其他字段的所有访问,但我看不出任何真实的情况.在任何情况下,具有虚拟字段的目的仅仅是通过其存在来提供适当的同步似乎是浪费的.
是否有任何干净的方法通知编译器data
构造函数中的特定写入应该具有关于在构造函数返回之后发生的该字段的任何读取的发生前关系(如果字段是这样的情况final
),无需支付相关的成本volatile
,锁等?或者,如果一个线程被读取data
并且发现它为null,它是否能以某种方式重复读取,以便在写入data …
在使用ASCII作为其字符集的C编译器上,字符文字的值'??<'
将等于'{'
,即0x7B.什么将是字面的一个编译器,其字符集不值有一个{
角色?
在字符串文字之外,编译器可以推断出??<
应该具有与定义的开括号字符相同的含义,即使编译器字符集没有开括号字符.实际上,三字母的整个目的是允许使用可表示字符的序列来代替不可表示的字符.该规范要求三字符甚至在字符串文字中处理,然而,这令我感到困惑.如果编译器的字符集包含一个{
字符,编译器可以允许'{'
表示为'??<'
,但字符集包括{
我看不出程序员不会简单地使用它.{
但是,如果字符集不包含,这似乎是首先使用三字符串的唯一原因,编译器应该??<
用什么可表示的字符代替?
restrict
添加到C99 的关键字的主要用途之一是允许编译器将某些内容加载到寄存器中,并假设寄存器将镜像这样加载的变量的状态.特定
void foo1(int * restrict a, int * restrict b) {
(*a)++; (*b)++; (*b)+=(*a);
}
Run Code Online (Sandbox Code Playgroud)
编译器有权假设写入(*b)
不会受到影响(*a)
,从而避免(*a)
在其之后重新加载.是否restrict
有混淆的任何其他影响?例如,给定:
extern void foo2a(int * restrict q);
extern void foo2b(void);
int x;
int foo2(restrict int *q) {
int z=x;
x++; *q++; x++;
foo2a(&z);
x++; *q++; z++;
foo2b();
x++; *q++; z++;
return x+(*q)+z;
}
Run Code Online (Sandbox Code Playgroud)
是否需要编译器预期增加*q
,调用foo2a()
和foo2b()
可能都会受到干扰x
,并且调用可能对" x
和"的值"感兴趣" *q
?编译器是否需要假设调用foo2a()
可能持有其参数 - 即使它被标记restrict
,这样foo2b()
可以修改z …
c restrict strict-aliasing language-lawyer restrict-qualifier
我有一个应用程序,它应该与多个自定义设备通信,其中一些使用FTDI USB到串行转换器芯片,其中一些使用TCP.应用程序需要能够随时接受来自可能随时插入或拔出的设备的数据; 该应用程序充当设备和数据库之间的桥梁.
似乎当设备被拔出时,它通常会导致SerialPort类在BackgroundWorker线程中抛出异常并使应用程序崩溃.
我目前的补救措施,可能是荒谬的复杂,是让一个帮助应用程序发送/接收串行端口数据并将其中继到TCP套接字/从TCP套接字中继.当我的主应用程序看到插入了USB设备时,它会启动另一个应用程序,然后使用TCP套接字与之通信.如果插入了多个USB设备,则将为每个设备启动一个单独的帮助应用程序实例.当拔出USB端口时,帮助应用程序将崩溃,但"意外关闭"消息将被扼杀.
这种方法有效,但似乎大都不满意.必须有一个更好的方法.
我有一个数据库,存储各种仪器的温度记录数据.数据可以每分钟记录一次.设计日志表的一种方法是将每个日志条目与设备ID,时间戳和序列号一起放在自己的行中(即使设备上的时钟发生更改,也应该可以对条目进行排序)按实际测量的顺序).然而,这似乎非常低效,因为除了系统为索引添加的任何内容之外,每个16位测量都可能附加16字节的其他数据.我认识到尝试优化数据库中的每个最后一个字节通常是毫无意义的,但是将数据扩展9:1或更差似乎很愚蠢.
目前,我将记录聚合成等间距读数的组,并且每个记录以可变长度不透明二进制格式存储一个组以及第一次读取的设备ID,时间戳和序列号,以及读数之间的间隔.这很好用,而且我所知道的可能是最好的方法,但它不允许查询的方式.
有没有很好的方法来处理这些数据集而没有过多的冗余?
我有一个偶尔会出现故障的程序,我想知道这些问题是否与运行在不同内核上的不同线程有关,处理读写的顺序不同(我知道x86内存模型需要不同的内核才能完成预期的工作但是在某些情况下,读取和写入无法在单个CPU上重新排序,但可能在多核系统上重新排序.将处理器亲和性设置为某些特定选择的任意CPU核心似乎不是一个好主意(如果该核心发生繁忙,没有理由所有线程都不能迁移到其他核心,只要有一个完整的缓存先冲洗).有没有办法简单地指示所有线程必须在同一个核心上运行,但我不关心它是哪一个?
PS -我的理解是,如果一个线程将一些数据写入类实例,然后对类引用执行CompareExchange(因此引用将指向新修改的实例),这意味着对实例的所有更改都将是在课程参考之前写到内存; 在使用该类引用的同一CPU上的另一个线程上运行的代码将使用类引用的旧值或将看到对该实例所做的更改; 但是,在其他CPU上运行的代码可能会在某些棘手的情况下看到类引用的新值,但看不到写入实例的新数据.我的理解是错误的吗?
通常建议应该密封不可变类,以强制向消费者承诺观察到的类的属性将保持不变.当然,对于将在安全环境中使用的类来说,这似乎是一种很好的做法.另一方面,在许多情况下,拥有许多具有共同基本特征的不可变类可能是有用的,并且还具有这种类的可编辑版本.
例如,图形程序可能有一个包含位置,字体和字符串的DrawnText对象,以及一个衍生的DrawnFancyText字符串,它将参数添加到形状周围的曲线文本中.在某些上下文中使用这些对象的不可变版本(例如,对于诸如撤消缓冲区之类的东西)可能是有用的,但在其他上下文中,具有可变版本可能更有用.
在这样的上下文中,有一些上下文需要一个可读的DrawnFancyText对象,但不关心它是否可变,但是还有一些上下文需要一个不可变的衍生文件:DrawnText或者DrawFancyText,但不关心哪个.实现前者需要EditableDrawnFancyText和ImmutableDrawnFancyText具有共同基础; 实现后者需要ImmutableDrawnText和ImmutableDrawnFancyText具有共同基础.遗憾的是,如果没有多重继承,就无法实现这样的模式,因为ImmutableDrawnText与EditableDrawnFancyText没有任何关系.幸运的是,接口确实允许多重继承,即使类没有.
看来,实现正确的继承关系的最佳方法是定义接口:
看起来让类的使用者使用接口而不是类会实现所有正确的对象关系.另一方面,暴露接口意味着消费者必须相信没有人实现所谓的"不可变"接口与允许外部突变的对象.
对于非安全敏感信息,使用接口是否合适以便允许正确的继承关系,并依赖实现者不违反合同?
理想情况下,可以充分公开公共接口以允许传递外部实例,而不必允许外部代码定义自己的实现.如果这是可行的,那似乎是最佳方法.不幸的是,虽然可以使用"内部"限定的构造函数公开公共抽象类,但我不知道任何这样的接口能力.尽管如此,我不确定是否有人使用允许外部突变的对象实现"IImmutableDrawnText"必然是一个真正的问题.
编辑 IDrawnText只会暴露getter而不是setter,但是它的文档会明确声明实现IDrawnText的对象可能通过其他方式可变,也可能不可变; IImmutableDrawnText将公开与IDrawnText相同的成员,但文档将明确声明禁止允许变异的类实现接口.什么都不会阻止可变类违反合同实现IImmutableDrawnText,但任何和所有这样的类都将是该接口的破坏实现.
在我的一些项目中,我发现自己宣布了一个相当无聊的课程:
Class Holder(Of T) Public It As T Sub New(ByVal It As T) Me.It = It End Sub End Class
例如,允许对象以这样的方式向另一个对象提供信息,使得信息可以随后在任何地方发生变化.例如,在一个词典(串,持有人(中SomeImmutableType)),所以可以更新SomeImmutableType的事情,而不必改变词典本身(因为字典对一个给定的关键条目总是包含相同的Holder对象,即持有人对象可以用作锁).
是否有更适合此目的的内置类?我更喜欢.net 2.0兼容性,但即使在4.0中,Tuple类型也是不可变的.如果没有这样建于一件事,就是它需要一个持有人类型来定义它本身作为一个嵌套的类型,或者要求有一个项目中持有人一个定义每种类型的更好吗?
我所知道的唯一内置的东西是Array.使用一个元素的数组是可行的,但它感觉真的很吵,因为通常当代码有一个数组时,期望它可以使用某个大小而不是一个.
PS -用例:
我正在尝试设计一个宏来生成与需要初始化的事物相关的几个相关数据结构.代码必须在C和C++下编译.目标是有类似的东西:
MUNGE_THING(struct1); MUNGE_THING(array1);
变成相当于的东西
munge_thing((void*)&struct1, sizeof(struct1)); munge_thing((void*)array1, sizeof(array1));
是否有任何语法的东西我可以围绕宏参数,以便它在处理地址和获取大小时都能正确处理数组和结构?最可能的上下文将在初始化列表的常量声明中.
如果这是不可能的,并且有必要为结构和数组使用单独的宏,那么确保错误传递错误的最佳语法将产生编译错误而不是伪造的代码?
在"旧"C中,在数组地址前添加"&"会产生警告,但不会阻止编译.在C++中,它似乎产生一个存储数组地址的位置的地址.
MUNGE_THING宏将位于另一个宏中,该宏将使用不同的MUNGE_THING定义多次调用,因此对阵列和结构使用单独的宏将是令人厌烦的.我能想到的最好的方法是给MUNGE_THING一个额外的"可选"&符号参数,但这看起来很丑陋.