小编cha*_*ley的帖子

C++链接器会自动内联函数(没有"inline"关键字,而不在头文件中实现)?

C++链接器是否会自动内联"传递"函数,这些函数未在头文件中定义,并且未明确要求通过inline关键字"内联" ?

例如,以下情况经常发生,并且应始终受益于"内联",似乎每个编译器供应商都应该通过链接器"内联""自动"处理它(在可能的情况下):

//FILE: MyA.hpp
class MyA
{
  public:
    int foo(void) const;
};

//FILE: MyB.hpp
class MyB
{
  private:
    MyA my_a_;
  public:
    int foo(void) const;
};

//FILE: MyB.cpp
// PLEASE SAY THIS FUNCTION IS "INLINED" BY THE LINKER, EVEN THOUGH
// IT WAS NOT IMPLICITLY/EXPLICITLY REQUESTED TO BE "INLINED"?
int MyB::foo(void)
{
  return my_a_.foo();
}
Run Code Online (Sandbox Code Playgroud)

我知道MSVS链接器将通过其链接时间代码生成(LTGCC)执行一些"内联" ,并且GCC工具链还支持链接时间优化(LTO)(请参阅: 链接器内联函数能否?).

此外,我知道有些情况下不能 "内联",例如当实现对链接器"不可用"时(例如,跨共享库边界,发生单独链接).

但是,如果这是代码链接到一个单一的,不跨越DLL /共享-lib的边界可执行文件,我希望编译器/连接器供应商,以自动内联函数,作为一个简单的和显而易见的优化(使双方获益的性能-和大小)? …

c++ optimization linker inline compiler-optimization

15
推荐指数
4
解决办法
5648
查看次数

单向散列(不是加密/安全),使用SHA256(不是MD5,SHA-1)?

在新系统上,我们需要单向散列来计算来自二进制输入的数字签名(例如,一千字节的文本或更大的文本和二进制文件).需求类似于Scons(构建系统)散列命令行和源文件,以及Git(版本控制系统)如何散列文件以计算存储/同步签名.

回想一下,Scons使用MD5,Git使用SHA-1.

虽然MD5和SHA-1已被"破坏",但Scons和Git都没有专门用于安全性(例如,它不存储密码),因此一般做法仍然认为这些算法可以接受.(当然,由于传统的采用,这部分是合理化的.)

问题:您是否会在新系统中使用SHA256(不是MD5或SHA-1)进行(非加密/安全)单向散列?

关注的是:

  1. MD5和SHA-1的采用历史悠久
  2. SHA256相对较新(没有那么多的历史记录),但似乎目前推荐用于新工作(但我的应用并不特别要求"更强"的算法强度)
  3. SHA256的计算时间更长
  4. SHA256生成一个更长的密钥(这些密钥将用作目录/文件名,并存储在索引文件中),但我想我可以截断生成的密钥(散列不太强,但应该足够),或者只是假设存储很便宜和文件系统可以处理它.

我特别感兴趣的是一个与Scons或Git社区一致的答案,"我们会永远保留我们的!" 或者"我们希望尽快转向新哈希!" (我不确定他们的计划是什么?)

git hash md5 scons sha256

14
推荐指数
2
解决办法
8681
查看次数

WNetAddConnection2()和NetUseAdd()之间的区别

我在本地安装了一个远程驱动器(请参阅GetVolumeNameForVolumeMountPoint()的用户/密码问题(Windows远程驱动器安装?))

问题:WNetAddConnection2()和之间的区别是什么NetUseAdd() 看来它们每个都允许您为提供用户名和密码的本地驱动器号分配远程驱动器路径.

此外,我可以调用WNetAddConnection2()指定本地驱动器号(工作),或为本地驱动器号指定"NULL",并且控制台net use命令将显示成功将远程驱动器安装到本地"无" - 正如您所期望的那样 - 但是我不确定这种结果的目的.我希望它能在本地系统/进程和远程计算机之间建立"登录凭据",以便其他调用::GetVolumeNameForVolumeMountPoint()具有正确的用户名/密码上下文,但这对我不起作用.

最终目标是在没有本地驱动器号的情况下本地安装远程驱动器(类似于本地GUID路径共享,因为所有26个本地驱动器号都已在使用中),但所有调用都::GetVolumeNameForVolumeMountPoint()失败Logon failure: unknown user name or bad password,即使我成功安装到远程驱动器之后也是如此提供远程用户名和密码(当前使用WNetAddConnection2())的本地驱动器号.

c++ windows user-accounts mount-point

6
推荐指数
1
解决办法
2873
查看次数

MSVS C++,如何使用*.i扩展名编译已经预处理的文件?

相关问题: 如何在两个单独的步骤中运行MSVC预处理器和编译器?

我明确地预处理MyFile.cpp(不编译)到a MyFile.i.我想稍后"编译"该文件(显式跳过预处理会很好,但正如相关问题所示,听起来这对MSVS来说是不可能的.)

问题:这MyFile.i是一个"无法识别的扩展",并cl.exe假设它是一个"目标文件",导致"无操作".(请参阅Microsoft警告:http: //msdn.microsoft.com/en-us/library/zfsbakc5(v = VS.90).aspx,此警告对MSVS 2005,2008,2010有效).

我找不到一个开关来声明它是一个"源文件"(不是目标文件).相关问题明确使用了" MyFile_preprocessed.cpp"惯例,但我真的宁愿遵守(更普遍的)MyFile.i惯例.

问题:是否有可以MyFile.i用MSVS 编译的标志?

c++ compiler-construction compiler-flags visual-c++ c-preprocessor

4
推荐指数
1
解决办法
1049
查看次数

C#和C++可以互操作以获得高性能代码吗?

我们有传统的C++代码执行高性能数据处理(例如,从硬件设备馈送的大量数据,以时间敏感的方式处理,用于显示,转换和传输到二级存储).

我们感兴趣的是C#/ .NET用于新的GUI和新的实用程序(现有的GUI是C++ MFC和Qt).当然,对于现有系统,我们对.NET虚拟机没有"语言翻译"问题(现有代码都是C++).

经过大量的研究和许多书籍,我不确定这是否可以有效地完成.可能的方法(我错过了吗?):

  1. 重写.NET中的所有内容(不可能发生 - 代码太多,裸机设备访问,时间敏感的重算法处理)
  2. 适用于托管C++/CLI的精简适配器层
  3. 适用于托管C++/CLI的胖适配器层
  4. 不要使用.NET(经理感到非常悲伤)

我们对(2)"瘦适配器层"的关注是,如果GUI可以(重新)使用"业务"层中的逻辑(许多属性是算法派生的),那将是很好的,所以如果我们不公开/包装C++类,很多GUI逻辑只会复制业务层中的现有C++逻辑.

我们对(3)"厚适配器层"的担忧是用C#类包装每个C++类似乎非常繁琐(昂贵),并且有几本书表明跨越该边界的装箱/取消装箱访问似乎表明这种方法是不可行的/禁止(它的性能超出了琐碎的设计).

如何在C++中实现的深层次类结构之上界面新的C#/ .NET(GUI)?

performance c++-cli legacy-code

1
推荐指数
1
解决办法
2265
查看次数

为什么:: feof()与:: _ eof(:: fileno())不同?

免责声明:不要::feof()用作你的循环条件. 例如,请参阅以下答案: 文件读取:二进制文件的feof()

但是,我有"真正的"代码,它演示了一个不能::feof()用作我的循环条件的问题,但是LOGICALLY,这是演示问题的最简单方法.

请考虑以下事项:我们一次迭代一个字符流:

FILE* my_file;
// ...open "my_file" for reading...

int c;
while(0 == ::feof(my_file))
{ // We are not at EOF
  c = ::getc(my_file);
  // ...process "c"
}
Run Code Online (Sandbox Code Playgroud)

上面的代码按预期工作: 文件一次处理一个char,然后EOF我们退出.

但是,以下是出乎意料的行为:

FILE* my_file;
// ...open "my_file" for reading...

int c;
while(0 == ::_eof(::fileno(my_file)))
{ // We are not at EOF
  c = ::getc(my_file);
  // ...process "c"
}
Run Code Online (Sandbox Code Playgroud)

我原以为他们会这样做. ::fileno()每次都正确返回(整数)文件描述符.但是,测试只::_eof(::fileno(my_file))运行一次,然后在第二次尝试时返回1(指示a EOF).

我不明白. …

c++ file-io stream filestream

0
推荐指数
1
解决办法
743
查看次数

MSVC2008,如何从“查找和替换”对话框中关闭“声音”?

MSVC 2008 IDE 在完成“查找和替换”对话框后播放可听见的“声音/铃声”。

真烦人——你怎么把它关掉?

(我需要 PC 声音,否则会启用。)

visual-studio-2008 visual-studio

0
推荐指数
1
解决办法
1521
查看次数