几年前,除了最简单的Perl脚本之外,我采用了以下"模式":(我甚至不记得我先看到它的位置,这当然不是我真正的想法.)
use strict;
...
sub main {
...
}
... possibly more subs ...
... at the end of the file:
#############
# Call main #
&main();
#############
Run Code Online (Sandbox Code Playgroud)
这有什么好处吗?我发现代码有点干净,但除此之外我不确定这有什么目的让我的C程序员开心:-)
来自Perl专家和高级用户的任何见解表示赞赏.(我当然不是)
似乎有一些协议,char由于C++别名规则,你不能毫无疑问地将一个int(一个int*)指向一个数组.
从另一个问题 - 基于通用char []的存储和避免严格别名相关的UB - 它似乎允许(重新)通过新的放置使用存储.
alignas(int) char buf[sizeof(int)];
void f() {
// turn the memory into an int: (??) from the POV of the abstract machine!
::new (buf) int; // is this strictly required? (aside: it's obviously a no-op)
// access storage:
*((int*)buf) = 42; // for this discussion, just assume the cast itself yields the correct pointer value
}
Run Code Online (Sandbox Code Playgroud)
那么,上面是合法的C++ 并且是实际需要的新版本才能使其合法化吗?
c++ strict-aliasing placement-new primitive-types language-lawyer
经过相当多的搜索,我找不到这个问题的答案.
OperationTimeout和之间的确切区别是什么SendTimeout?我读OperationTimeout的一个子集SendTimeout,并SendTimeout包括在所述信道写消息.如果您提供更多详细信息,那就太棒了.
我的第二个问题是我有一个客户端调用服务,我只想在发送到服务器的请求之后不久和服务器收到回复之后设置超时.如何设置此超时?
在C++中是否有一个优雅的解决方案,以防止必须声明复杂的对象变量,这些变量仅出于效率原因而仅在循环外的循环中使用?
一位同事提出了一个有趣的观点.我们的代码策略,其中说明(释义):始终对变量使用最小范围,并在第一次初始化时声明变量.
编码指南示例:
// [A] DO THIS
void f() {
...
for (int i=0; i!=n; ++i) {
const double x = calculate_x(i);
set_squares(i, x*x);
}
...
}
// [B] DON'T do this:
void f() {
int i;
int n;
double x;
...
for (i=0; i!=n; ++i) {
x = calculate_x(i);
set_squares(i, x*x);
}
...
}
Run Code Online (Sandbox Code Playgroud)
这一切都很好,在你从原始类型转移到对象之前,这肯定没有错.(对于某种界面)
例:
// [C]
void fs() {
...
for (int i=0; i!=n; ++i) {
string s;
get_text(i, s); // …Run Code Online (Sandbox Code Playgroud) 我不希望函数指针开销,我只想要具有相同签名的两个不同函数的相同代码:
void f(int x);
void g(int x);
...
template<typename F>
void do_work()
{
int v = calculate();
F(v);
}
...
do_work<f>();
do_work<g>();
Run Code Online (Sandbox Code Playgroud)
这可能吗?
清除可能的混淆:"模板参数"是指模板的参数/参数,而不是模板类型的函数参数.
鉴于以下两种编码风格,请在编写C++代码时指定一个理由(一些优点/缺点),以解释为什么一个可能优于另一个.
( 请不要不带"并不重要"回答,"只要坚持一个";等等.现在的问题是关于具体可能PRO /缺点(如果有的话)的两个间隔低于风格感谢.)
// VARIANT A (NO space after control keyword / space before curly brace)
if(condition) {
// ...
}
else if(c2) {
// ...
}
else {
// ...
}
for(int i=0; i<e; ++i) {
// ...
}
...
// vs. VARIANT B (space after control keyword / NO space before curly brace)
if (condition){
// ...
}
else if (c2){
// ...
}
else{
// ...
}
for …Run Code Online (Sandbox Code Playgroud) TL; DR是否所有生成的注册表项都regsvr32需要出现在SxS reg-free-COM清单中,反之亦然?
我正在尝试获得免注册的COM用于第三方组件.
读 了 关于主题,我发现有提到的几个要素,即可以放入一个清单:
从文档中,我们可以将以下标记添加到清单中以描述COM组件:
assemblyIdentity- 据我所知,这真的只是描述了"抽象集会 "comClass - 描述COM类(IID接口).看来,这总是需要的.typelib - 什么时候?comInterfaceExternalProxyStub - 什么时候?comInterfaceProxyStub - 什么时候?从其他文档HKEY_LOCAL_MACHINE\SOFTWARE\Classes我们可以看到COM注册表项有几个类别:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{CLSID} 我假设大致相当于comClassHKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{IID}将对应于任何一个 comInterface[External]ProxyStub,但我真的不知道何时使用哪个(或两者)typelib清单条目?使用regsvr42来提取我试图注册的dll会产生一个只包含comClass条目,没有typelib或ProxyStub条目的清单.(我交叉检查写的密钥,有问题的DLL pdm.dll,MS的Process Debug Manager只写那些密钥,也就是说,注册表中没有明显的类型库或代理存根信息.)
如果注册表只包含与此相关的信息,comClass则表示此信息在SxS清单中是足够的,或者清单中是否需要其他信息?
另外,我注意到注册表包含a VersionIndependentProgId和a ProgId,其末尾附加了版本号.清单只有一个ProgId条目,文档说明:
progid:与COM组件关联的与版本相关的编程标识符.ProgID的格式是
<vendor>.<component>.<version>.
但文档也说明了这一点
该comClass元素可以有
<progid>...</progid>子元素,其中列出的版本有关的ProgID.
并且他们说 progid属性应该是版本独立的属性.
那么,放在这里的是什么?当客户端没有请求特定版本时,它是否重要?
说我有一个可执行文件: app.exe
我在这个可执行文件中使用了2个不同的第三方DLL:foo.dll bar.dll应用程序必须隐式链接到这些DLL,即我无法用::LoadLibrary它们加载它们.
(注意:这不是我不能调用LoadLibrary,但这些DLL需要静态链接(C++ DLL __declspec(dllexport)),所以我调用LoadLibrary没有任何意义,因为可删除的加载器已经调用它.)
这两个DLL 彼此没有任何依赖关系,也就是说,就我所知,它们的加载顺序是不确定的(并且应该是无关紧要的).(两者的依赖性基本上只在标准的Windows dll(kernel32,msvcrt等)上
我现在有一个问题,我希望控制这些DLL的加载顺序,我希望foo.dll 总是DLL_PROCESS_ATTACH在bar.dll之前加载().
是否有可能告诉Windows DLL Loader在另一个之前加载一个DLL?
编辑:要检查可执行文件的DLL加载顺序,可以使用该DUMPBIN.exe实用程序:(只需启动Visual Studio命令提示符)
编辑:根据此答案/此博客条目,NT Loader 会按顺序执行导入部分.(这将导致独立的 DLL按照它们在导入部分中出现的顺序加载.)
C:\path\to\program> dumpbin /IMPORTS app.exe | grep -i \.dll
MSVCR80D.dll
KERNEL32.dll
OLEAUT32.dll
MSVCP80D.dll
foo.dll
bar.DLL
Run Code Online (Sandbox Code Playgroud)
此输出表示将首先加载MSVCR80D.dll(及其依赖项[a]),最后将加载bar.DLL.卸载将以相反的顺序发生.
我还没有发现的是如何影响这个加载顺序 ......
(笔记)
[a]:这当然意味着首先会加载kernel32.dll,因为msvcr80d.dll将依赖于kernel32.dll.
按一些要求,我加入一个理由是:(但请,我仍然有兴趣在此一般.我知道如何解决该问题的MFC. ) …
基本上,我有点厌倦写作:
std::map<key_t, val_t> the_map;
...
auto iterator = the_map.find(...);
if(iterator != the_map.end()) { // note the "inversed" logic and logically superflous end() call
...
}
Run Code Online (Sandbox Code Playgroud)
真正有意义的是:
if(auto x=the_map.find(...)) {
... // x could either be an iterator or maybe something like boost::optional<val_t>
}
Run Code Online (Sandbox Code Playgroud)
是否有一些现有技术定义了一些辅助工具来缩短!= container.end()语法,或者我是唯一一个因此而烦恼的人?
注意:这里根本没有多线程.刚刚优化的单线程代码.
函数调用引入了序列点.(显然).
它是否遵循一个编译器(如果优化内联函数)是不能够移动/交融的任何指示前/后函数的说明?(只要它能"证明"没有明显的可观察效果.)
解释性背景:
现在,有一篇很好的文章.作为C++的基准测试类,作者说:
我们时间的代码不会被优化器重新排列,并且总是位于对now()的开始/结束调用之间,因此我们可以保证我们的时序有效.
我问他怎么可以肯定,尼克回答说:
您可以在此答案中查看评论 https://codereview.stackexchange.com/a/48884.我引用:"由于允许编译器进行优化,我会小心计算不是函数的函数.我不确定排序要求和对此类程序的可观察行为理解.通过函数调用,不允许编译器在调用点之间移动语句(它们在调用之前或之后排序)."
我们所做的基本上是抽象的可调用(函数,lambda,由lambda包围的代码块),并
callable(factor)在measure结构内部有一个signle调用 作为屏障(不是多线程中的障碍,我相信我传达了这个消息).
我对此非常不确定,特别是引用:
通过函数调用,不允许编译器在调用点之间移动语句(它们在调用之前或之后排序).
现在,我总是认为当优化器内联某些函数时(在(简单)基准测试场景中可能就是这种情况),只要它不影响可观察行为,就可以自由地重新排列任何它喜欢的东西.
也就是说,就语言/优化器而言,这两个片段完全相同:
void f() {
// do stuff / Multiple statements
}
auto start = ...;
f();
auto stop = ...;
Run Code Online (Sandbox Code Playgroud)
与
auto start = ...;
// do stuff / Multiple statements
auto stop = ...;
Run Code Online (Sandbox Code Playgroud) c++ ×8
c# ×1
coding-style ×1
com ×1
dll ×1
function ×1
inline ×1
iterator ×1
loader ×1
loops ×1
manifest ×1
optimization ×1
performance ×1
perl ×1
regfreecom ×1
side-by-side ×1
stl ×1
templates ×1
wcf ×1
windows ×1