编译器在优化RELEASE构建方面做得很好,但有时候确保为本地函数关闭优化(但不是通过unticking来关闭整个项目Project Options > Optimize code
)会很有用.
在C++中,这是使用以下内容实现的(#pragma
通常注释掉):
#pragma optimize( "", off )
// Some code such as a function (but not the whole project)
#pragma optimize( "", on )
Run Code Online (Sandbox Code Playgroud)
C#中有等价物吗?
几个很好的答案建议用这个方法装饰MethodImplOptions.NoOptimization
.这是在.NET 3.5中实现的,但不是在Compact Framework(CF)版本中.一个相关的后续问题是,是否相当于:
* projects targeting .NET 3.0 or earlier?
* projects deployed to a device such as Windows CE 6.0 using the .NET 3.5 CF?
Run Code Online (Sandbox Code Playgroud) .net c# optimization compact-framework compiler-optimization
我在 Windows 10 上使用 Visual Studio Code 进行大量 C++ 开发。我的开发计算机的硬盘容量有限,并且Low disk space
经常出现警告。
经过强大的WinDirStat
实用程序分析后,%APPDATA%\Code\User\workspaceStorage
发现其中包含数百MB。有几十个随机的 32 字符文件夹(例如“9731bc4ee103e04b5a91aff76967e74b”),每个文件夹都包含.\ms-vscode.cpptools\.BROWSE.VC.DB
通常大于 30 MB 的文件。
%APPDATA%\Code\User\workspaceStorage
能否在 Windows 启动时使用批处理脚本安全删除这些文件,或者更好的是整个文件夹?
我来自C++背景.之前已经问过这个问题,但试着尽可能找不到答案.比方说我有:
string[] ArrayOfReallyVeryLongStringNames = new string[500];
ArrayOfReallyVeryLongStringNames[439] = "Hello world!";
Run Code Online (Sandbox Code Playgroud)
我可以创建一个引用上面的字符串(这些都不会编译):
string a = ref ArrayOfReallyVeryLongStringNames[439]; // no compile
string a = &ArrayOfReallyVeryLongStringNames[439]; // no compile
Run Code Online (Sandbox Code Playgroud)
我确实理解字符串在C#中是不可变的.我也明白你无法获得托管对象的地址.
我想这样做:
a = "Donkey Kong"; // Now ArrayOfReallyVeryLongStringNames[439] = "Donkey Kong";
Run Code Online (Sandbox Code Playgroud)
我已经阅读了Stack Overflow问题在C#中引用了另一个字符串, 它有一个很好的答案,但问题略有不同.我不想通过引用将此参数传递给函数.我知道如何使用"ref"关键字通过引用传递参数.
如果答案是"您不能在C#中执行此操作",是否有方便的解决方法?
编辑:一些答案表明问题不清楚.让我们以不同的方式问它.假设我需要操纵原始长命名数组中具有主要索引的所有项目.我想在Array ... [2],Array ... [3],Array ... [5]等中添加别名到列表中.然后,使用"for"循环修改列表中的项目(可能通过将刚创建的列表传递给函数).
在C#中,"using"关键字为类或命名空间创建别名.从答案来看,似乎无法为变量创建别名.
我怀疑答案是否定的,但是有没有相当于C++一元前缀和后缀增量运算符"++".例如.
int test = 1;
SomeFunc(test++); // test is 1 inside SomeFunc and 2 afterwards
test = 1;
Somefunc(++test); // test is 2 inside SomeFunc and 2 afterwards
Run Code Online (Sandbox Code Playgroud)
我知道Delphi中的Inc(和Dec)运算符,但是你不能将它传递给函数,如:
test: Integer;
//...
SomeFunc(Inc(test)); // compiler error, incompatible types
Run Code Online (Sandbox Code Playgroud)
除了编译错误之外,似乎没有不同的前缀和后缀增量.写这样的代码不是一个大问题:
SomeFunc(test);
test := (test + 1);
SomeFunc(test);
Run Code Online (Sandbox Code Playgroud)
但是C++中的++(和 - )运算符是一个很棒的特性.
当您定义模板时,VS 2019 会显示一个带有文本的浮动弹出框<T> Provide sample template arguments for Intellisense
。您可以提供类似 的模板类型int
,但是有没有办法让这个浮动框消失而不完全关闭智能感知?
例子:
template <typename T> // popup box appears here after a few seconds, see image
struct POINT {
T x, y;
}
Run Code Online (Sandbox Code Playgroud)
使用运行 Windows 10 的新工作笔记本电脑,我安装了git
、Visual Studio Code
和Visual Studio 2019
. 在对我的个人 git 存储库(托管在 )中的代码进行一些测试更改后github
,我尝试提交这些更改并将其推送到远程存储库。
我可以执行 中的所有Stage
、Commit
和Push
操作Git Bash
。但在 Git Gui、VS Code 和 VS 2019 中,Stage
两者Commit
都工作正常,但Push
失败并显示错误消息。
对于 VS Code,错误是:
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Run Code Online (Sandbox Code Playgroud)
对于 VS 2019,错误类似:
git@github.com: Permission denied (publickey).
Error encountered while pushing to the remote repository: Git failed with a fatal error.
Could …
Run Code Online (Sandbox Code Playgroud) 各种答案表明睡在线程中是一个坏主意,例如:避免睡眠.为什么呢?经常给出的一个原因是,如果正在休眠,很难优雅地退出线程(通过发信号通知它终止).
假设我想定期检查网络文件夹中的新文件,可能每10秒检查一次.这对于优先级设置为低(或最低)的线程来说似乎是完美的,因为我不希望可能耗时的文件I/O影响我的主线程.
有哪些替代方案?代码在Delphi中给出,但同样适用于任何多线程应用程序:
procedure TNetFilesThrd.Execute();
begin
try
while (not Terminated) do
begin
// Check for new files
// ...
// Rest a little before spinning around again
if (not Terminated) then
Sleep(TenSeconds);
end;
finally
// Terminated (or exception) so free all resources...
end;
end;
Run Code Online (Sandbox Code Playgroud)
一个小修改可能是:
// Rest a little before spinning around again
nSleepCounter := 0;
while (not Terminated) and (nSleepCounter < 500) do
begin
Sleep(TwentyMilliseconds);
Inc(nSleepCounter);
end;
Run Code Online (Sandbox Code Playgroud)
但这仍然涉及睡眠......
我有一个包含TImage和TButton控件的表单.我注意到响应OnClick事件的速度对于TImage来说似乎有点慢(快速点击!)所以我测量了它.对于100多次点击(并尽可能快地点击,保持每个控件的速率尽可能一致)我得到了指标:TButton:平均~105-116ms图像:平均~220-235ms
我重复了几次,结果相似.为什么TImage处理点击率大约是TButton的一半?处理从WM_LBUTTON_DOWN到OnClick事件的Windows消息队列会更慢吗?如果它们在前一次点击的N ms之内,它可能正在吞咽Clicks?
TImage的属性似乎没有任何影响这一点的东西.
注意:如果相关,请使用Delphi 7和标准VCL控件.
编辑:这是一些示例代码,演示我如何计时:
// Define variables (in class definition)
m_dwBtnClicks, m_dwImgClicks: DWORD;
m_dwLastBtnClickTicks, m_dwLastImgClickTicks: DWORD;
m_fTotalBtnClicksTicks, m_fTotalImgClicksTicks: Single;
// Initialise variables (in form's OnCreate event)
m_dwBtnClicks := 0;
m_dwImgClicks := 0;
m_dwLastBtnClickTicks := 0;
m_dwLastImgClickTicks := 0;
m_fTotalImgClicksTicks := 0.0;
m_fTotalImgClicksTicks := 0.0;
// OnClick events
procedure TfrmQwerty.btnClick(Sender: TObject);
var
dwTime: DWORD;
begin
// TButton click!
Inc(m_dwBtnClicks);
dwTime := GetTickCount();
if (m_dwLastBtnClickTicks > 0) then
m_fTotalBtnClicksTicks := (m_fTotalBtnClicksTicks + (dwTime - m_dwLastBtnClickTicks));
m_dwLastBtnClickTicks := dwTime;
end; …
Run Code Online (Sandbox Code Playgroud) 我有一个小结构,并发现复制单个成员要比一次复制结构快得多.有这么好的理由吗?
我的节目:
// Some random structure
private struct PackStats
{
public int nGoodPacks, nBadPacks, nTotalPacks;
}
// ...
PackStats stats1 = new PackStats();
PackStats stats2 = new PackStats();
// Set some random statistics
stats1.nGoodPacks = 55;
stats1.nBadPacks = 3;
stats1.nTotalPacks = (stats1.nGoodPacks + stats1.nBadPacks);
// Now assign stats2 from stats1
// This single line consumes ~190ns...
stats2 = stats1;
// ...but these three lines consume ~100ns (in total)
stats2.nGoodPacks = stats1.nGoodPacks;
stats2.nBadPacks = stats1.nBadPacks;
stats2.nTotalPacks = stats1.nTotalPacks;
Run Code Online (Sandbox Code Playgroud)
为了测量纳秒范围内的时间,我做了数百万次的分配:
uint uStart …
Run Code Online (Sandbox Code Playgroud) 我使用以下代码偶然发现了令人惊讶的编译器警告:
private const bool DEFAULT_SETTING = false;
//...
string aString = (DEFAULT_SETTING) ? "1" : "0";
Run Code Online (Sandbox Code Playgroud)
它会生成警告warning CS0429: Unreachable expression code detected
.
在最初困惑之后,我意识到编译器没有错,因为值DEFAULT_SETTING
是常量而且不能改变.因此,? "1"
永远无法到达三元运算符的一部分.但编译器也不完全正确,因为我自己或未来的开发人员可能希望(或需要)在不破坏代码的情况下更改默认值.
有没有更好的方法来使用类似于上面的上下文的默认设置,不会产生警告?
注意:您可能想知道我为什么要转换false
为"0"
...它是保存到设置XML文件.当文件丢失时,软件会自动生成带有默认设置的闪亮的新XML文件.