小编Jab*_*cky的帖子

如果你在一个快速乘法的架构上,有没有办法在编译时检查?

C代码是否有任何方法可以判断它是否在乘法快速的架构上编译?是否有一些宏__FAST_MULT__或在这些架构上定义的东西?

例如,假设您正在实现一个函数,通过shift-and-add方法确定64位整数的汉明权重.有两种最佳算法:一种需要17次算术运算,而另一种只需要12次,但其中一种是乘法运算.因此,如果您在硬件​​上运行,第二种算法的速度提高了30%,其中乘法所需的时间与添加时间相同 - 但是,在将乘法实现为重复加法的系统上,要慢得多.
因此,在编写这样的函数时,能够在编译时检查是否是这种情况并在适当时在两种算法之间切换是有用的:

unsigned int popcount_64(uint64_t x) {
    x -= (x >> 1) & 0x5555555555555555;                             // put count of each 2 bits into those 2 bits
    x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333); // put count of each 4 bits into those 4 bits
    x = (x + (x >> 4)) & 0x0f0f0f0f0f0f0f0f;                        // put count of each 8 bits into those 8 bits
#ifdef __FAST_MULT__
    return (x …
Run Code Online (Sandbox Code Playgroud)

c cpu-architecture

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

返回临时对象是否在C++中创建临时对象?

考虑C++中的以下代码:

struct A {A(int);};
A foo() {return static_cast<A>(0);}
A x = foo();
Run Code Online (Sandbox Code Playgroud)

这里static_cast<A>(0)通过标准[5.2.9-4]创建一个临时对象,它是一个prvalue.标准[12.2-1]说

类型的临时数在各种上下文中创建:绑定对prvalue的引用(8.5.3),返回prvalue(6.6.3),创建prvalue的转换(4.1,5.2.9,5.2.11,5.4) ,抛出异常(15.1),进入处理程序(15.3),以及一些初始化(8.5).

那么return语句会再次创建一个临时对象吗?

顺便说一下,任何人都可以告诉我标准是否保证隐式类型转换会创建一个临时对象?

c++ return type-conversion temporary-objects

10
推荐指数
2
解决办法
826
查看次数

方法调用意外地像l值一样

任何人都可以解释为什么这段代码编译:

typedef struct longlong
{
  unsigned long low;
  long high;
}
longlong;

typedef longlong Foo;    

struct FooStruct
{
private:
  Foo bar;

public:
  void SetBar(Foo m)
  {
    bar = m;
  }

  Foo GetBar()
  {
    return bar;
  }
};

int main()
{
  FooStruct f;
  Foo m1 = { 1,1 };
  Foo m2 = { 2,2 };
  f.SetBar(m1);
  f.GetBar() = m2;     // Here I'd expect an error such as
                       // "error: lvalue required as left operand of assignment"
}
Run Code Online (Sandbox Code Playgroud)

我预计编译失败的原因与error: …

c++

10
推荐指数
4
解决办法
738
查看次数

如何在程序中启用/禁用Windows 10电池保护程序?

我正在写一个小程序来保存笔记本电脑的电池,我现在可以在电源方案之间切换PowerSetActiveScheme.

下一步是在Windows 10中控制电池保护程序.虽然我可以使用它来读取它的状态,但GetSystemPowerStatus我找不到以编程方式启用/禁用它的方法.Windows API中是否有任何功能可以执行此操作?

c windows winapi

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

"[...]背后的想法使得整数指针没有强制转换"

我总是想知道为什么警告passing argument 1 from of 'foo' makes pointer from integer without a cast和警告只是警告而不是错误.

实际上这些警告几乎总是错误.

有人知道这背后的想法是什么?

  • 主要是允许编译史前代码而不会出错吗?
  • 或者只是为了遵守标准?然后后者可能需要一些修复.

例:

int foo(int *bar)
{
  *bar = 42;
}

void bar()
{
  int n = 0;
  foo(n);      // this is obviously an error
  ...
}
Run Code Online (Sandbox Code Playgroud)

c

10
推荐指数
2
解决办法
531
查看次数

将基于eclipse/cdt的构建集成到持续集成中

我必须重用一个目前在eclipse中开发的主要C++项目,使用CDT,mingw和cdt托管构建功能(没有外部makefile或构建环境).该项目本身由许多子项目组成.

我想将该构建集成到一个持续集成服务器(即jenkins),因此能够自动化无头构建.

到目前为止,我设法检查了项目(很容易从jenkins)并使用eclipse使用以下命令构建无头模式:

C:\prog\EclipseCdt\eclipse -nosplash -application org.eclipse.cdt.managedbuilder.core.headlessbuild -import %WORKSPACE%\project1 -import %WORKSPACE%\project2 -import %WORKSPACE%\project3 -build all
Run Code Online (Sandbox Code Playgroud)

然而,这还不够:

  • 构建是异步的:上一个命令返回(它实际上是分叉),而我希望它保持上下文,直到我有一个结果(就像make在Linux或devenvWindows上一样)
  • 我无法提取构建日志(理想情况下将它们放在文件中):要集成在我的连续信息中,我需要能够解析构建日志以显示有趣的信息(想想破碎的文件)
  • 理想情况下,我想从Eclipse获得一个指示通过或失败的直接状态(返回代码).

知道如何有这种行为吗?

注意:

  • 使用alternate(外部)构建系统目前不是一个选项(我必须保留cdt托管构建,它有很多复杂的历史记录)
  • 我已经看过堆栈溢出和谷歌并没有找到办法做到这一点,尽管我需要明显的简单性
  • 我目前在Windows 7/mingw 4.5.2/Eclipse IDE for C/C++ Developers版本:Indigo Release Build id:20110615-0604但我觉得问题是x-platform

eclipse eclipse-cdt jenkins

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

MFC消息映射中的函数地址

为什么由类向导生成的消息映射中的函数地址明确提到了类的名称?

例如:

ON_BN_CLICKED(IDC_CHECK1, &CMyDlg::OnClickedSomeButton)
Run Code Online (Sandbox Code Playgroud)

代替:

ON_BN_CLICKED(IDC_CHECK1, &OnClickedSomeButton)
Run Code Online (Sandbox Code Playgroud)

甚至:

ON_BN_CLICKED(IDC_CHECK1, OnClickedSomeButton)
Run Code Online (Sandbox Code Playgroud)

所有三种变体都能正确编译

这只是好奇心.

c++ mfc

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

重载,可变函数和bool类型

以下程序编译好并按预期工作.它的输出是:

1
2

#include <stdio.h>

class Foo
{
public:
  void Bar(const char* b, ...) { printf("1\n"); };
  void Bar(int a, const char* b, ...) { printf("2\n"); };
};

int main()
{
  Foo foo1;
  foo1.Bar("Test", "xx", 1, 2);
  foo1.Bar(1, "xx", "xx", 2, 2);
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我改变int的第二个参数Bar的功能为boolfoo1.Bar(1, "xx", "xx", 2, 2);foo1.Bar(true, "xx", "xx", 2, 2);,那么,下面一行将无法编译,我得到的错误:'Foo::Bar': 2 overloads have similar conversions:

  foo1.Bar("Test", "xx", 1, 2);
Run Code Online (Sandbox Code Playgroud)

整个程序不编译:

#include <stdio.h>

class Foo
{
public: …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

8
推荐指数
2
解决办法
351
查看次数

c ++ windows api:禁用菜单是否为灰色?

我正在测试Windows API的菜单状态(禁用,灰显,检查......)但是有些东西我不明白.该文件,各国MF_DISABLED不灰色的项目,但这里是我得到:

在此输入图像描述

使用此代码:

HMENU menuBar = CreateMenu();
HMENU hopMenu = CreateMenu();

AppendMenuW(menuBar, MF_POPUP, (UINT_PTR)hopMenu, L"hop");
AppendMenuW(hopMenu, MF_STRING, 0, L"Enabled");

AppendMenuW(hopMenu, MF_STRING | MF_DISABLED, 1, L"Disabled");
AppendMenuW(hopMenu, MF_STRING | MF_GRAYED, 2, L"Grayed");
AppendMenuW(hopMenu, MF_STRING | MF_CHECKED, 3, L"Checked");

AppendMenuW(hopMenu, MF_STRING | MF_DISABLED | MF_CHECKED, 4, L"Disabled && Checked");
AppendMenuW(hopMenu, MF_STRING | MF_DISABLED | MF_GRAYED, 5, L"Disabled && Grayed");

AppendMenuW(hopMenu, MF_STRING | MF_CHECKED | MF_GRAYED, 6, L"Checked && Grayed");

SetMenu(hwnd, menuBar);
Run Code Online (Sandbox Code Playgroud)

如何禁用未显示灰色的禁用菜单项?

c++ windows winapi

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

shared_ptrs 被删除两次

我想将指向Object类的共享指针存储在向量中:

测试代码:

#include <vector>
#include <iostream>
#include <memory>

using namespace std;   // only for brevity

class Object
{
public:
  int n;
  Object(int n) : n(n) { cout << "Object("  << n <<")\n"; }
  ~Object() { cout << "~Object(" << n << "))\n"; n = 0xdddddddd; }

};

void Test()
{
  std::shared_ptr<Object> p1(make_shared<Object>(Object(123)));
  std::vector<shared_ptr<Object>> v;

  cout << "before push_back\n";
  v.push_back(std::make_shared<Object>(Object(2)));
  v.push_back(p1);
  cout << "after push_back\n";

  cout << "Vector content:\n";
  for (auto& p : v)
    cout << "  " << …
Run Code Online (Sandbox Code Playgroud)

c++ vector shared-ptr stdvector c++11

7
推荐指数
2
解决办法
159
查看次数