问题列表 - 第33763页

优化"while(1);" 在C++ 0x中

更新,见下文!

我听说并读过C++ 0x允许编译器为以下代码段打印"Hello"

#include <iostream>

int main() {
  while(1) 
    ;
  std::cout << "Hello" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

它显然与线程和优化功能有关.在我看来,这可能让许多人感到惊讶.

有人能够很好地解释为什么必须允许这样做吗?作为参考,最新的C++ 0x草案说明了6.5/5

在for语句的情况下,在for-init语句之外的循环,

  • 不调用库I/O函数,和
  • 不访问或修改易失性对象,以及
  • 不执行同步操作(1.10)或原子操作(第29条)

可以通过实现来假设终止.[注意:这是为了允许编译器转换,例如删除空循环,即使无法证明终止也是如此. - 结束说明]

编辑:

这篇富有洞察力的文章谈到了标准文本

不幸的是,没有使用"未定义的行为".但是,只要标准说"编译器可以假设P",就暗示具有非-P属性的程序具有未定义的语义.

这是正确的,是否允许编译器为上述程序打印"Bye"?


这里有一个更有见地的线索,这是关于C的类似改变,由Guy完成上述链接文章开始.在其他有用的事实中,他们提出了一个似乎也适用于C++ 0x的解决方案(更新:这将不再适用于n3225 - 见下文!)

endless:
  goto endless;
Run Code Online (Sandbox Code Playgroud)

看来,编译器不允许优化它,因为它不是循环,而是跳转.另一个人总结了C++ 0x和C201X的建议更改

通过编写一个循环,程序员断言或者环路不可见的东西的行为(执行I/O,访问volatile对象,或执行同步或原子操作), 或者,它最终会终止.如果我通过编写一个没有副作用的无限循环来违反这个假设,我对编译器撒谎,而我的程序的行为是未定义的.(如果我很幸运,编译器可能会警告我.)语言不提供(不再提供?)表达无可见行为的无限循环的方法.


2011年3月3日更新为n3225:委员会将案文移至1.10/24并说

实现可以假定任何线程最终将执行以下操作之一:

  • 终止,
  • 调用库I/O函数,
  • 访问或修改易失性对象,或
  • 执行同步操作或原子操作.

goto把戏,工作了!

c++ optimization loops c++11

150
推荐指数
5
解决办法
1万
查看次数

继承问题

这是来自"Exceptional C++"的第24项,解决方案,页面底部的第一个子弹:

永远不要使用公共继承来实现"IS-ALMOST-A".我已经看到一些程序员,甚至是经验丰富的程序员,从基础公开继承并以保留基类语义的方式实现"大多数"被覆盖的虚函数.换句话说,在某些情况下,使用Derived对象作为Base将不会像合理的Base客户端所期望的那样运行.罗伯特·马丁经常引用的一个例子是从Rectangle类继承Square类通常被误导的想法"因为正方形是一个矩形".这在数学中可能是正确的,但在课堂上并不一定如此.例如,假设Rectangle类具有虚拟SetWidth(int)函数.然后广场' 设置宽度的实现也会自然地设置高度,使对象保持方形.然而,在系统的其他地方可能存在与Rectangle对象一起使用多态的代码,并且不会期望更改宽度也会改变高度.毕竟,对于一般的矩形来说,情况并非如此!这是违反LSP的公共继承的一个很好的例子,因为派生类不提供与基类相同的语义.它违反了公共继承的关键原则:"不再需要,也不能承诺." 这是违反LSP的公共继承的一个很好的例子,因为派生类不提供与基类相同的语义.它违反了公共继承的关键原则:"不再需要,也不能承诺." 这是违反LSP的公共继承的一个很好的例子,因为派生类不提供与基类相同的语义.它违反了公共继承的关键原则:"不再需要,也不能承诺."

我试过检查它,我写道:

// Square.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;
class Rectangle
{
private:
 unsigned width_;
 unsigned height_;
public:
 Rectangle(const unsigned width, const unsigned height):width_(width),height_(height)
 {/*Empty body*/ }
 unsigned GetWidth()const
 {
  return width_;
 }
 unsigned GetHeight()const
 {
  return height_;
 }
 virtual void SetWidth(const unsigned width)
 {
  width_ = width;
 }
 void SetHeight(const unsigned height)
 {
  height_ = height;
 }
 virtual ~Rectangle()
 {
  cout << …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance

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

jQuery的原型:Mindset迁移?

这不是一个并排的技术比较,而是关于如何"在jQuery中思考"与"在Prototype中思考".

我已经使用了Prototype很多年了,jQuery有点不那么重,直到大约一年前我开始做很多事情.

使用Prototype,我可以编写一些相当优雅的代码; 我的老板曾经审查过我的大量代码,并说这是他第一次有兴趣阅读的Javascript.我理解 - 并且从一开始就理解了 - 几乎本能地是Prototype试图做的事情,并且知道如何使用它.

我的jQuery代码更多,我怎么能把它,"workmanlike".我觉得好像我在每一步都在与jQuery作斗争.我必须(尝试)强迫自己坚持使用它而不是直接进入"原生"JS,我知道我可以更快地抨击干净的跨浏览器代码.使用它会使它更多,而不是更少,令人沮丧.

它不是(或至少不完全)缺乏对可用功能的熟悉.我经常知道我需要使用给定的函数,但它的使用方式似乎真的很奇怪.这通常表明我是以完全错误的方式来做的.

我想的越多,我就越想我以原型方式使用jQuery.

还有一些令人眼花缭乱的闪光灯还没有发生在我身上.特别是如果你和两者都做了很多工作,你发现什么是最基本的方法差异?当你从一个切换到另一个时,你如何调整你的心态?

不要害怕陈述令人眼花缭乱的明显,因为它可能只是那个致盲的闪光......

javascript jquery prototypejs

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

Digital Mars D编译器; 获取ASM输出

我正在阅读Andrei Alexandrescu关于D编程语言的书.他是一位优秀的作家,在解释D语言方面做得非常出色.然而,当我无法想象ASM输出或某些关键字的后果(例如输入,输出等或其他结构)时,我发现某些结构难以理解.即使我的ASM非常糟糕而且我从不使用它,但是能够理解某些关键字如何对计算机和正在进行的工作有所帮助,这对我有很大帮助.

DMD编译器有许多有趣的功能(代码覆盖,生成接口(头文件),生成文档,分析,...)但我还没有看到转换输出ASM代码.编译器会生成.obj文件,并从阅读以下链接:http://www.digitalmars.com/ctg/obj2asm.html我怀疑我需要一个工具来手动转换目标文件.我更喜欢编译器开关,有吗?

在该页面的底部,我链接到一个页面,我可以在其中支付包含该工具的产品.来自GNU背景,我非常不满意.这仅适用于C/C++,还是适用于D编译器?

有没有其他方法可以将这些.obj文件转换为可读的ASM代码,还是必须使用其他D编译器(如GDC或LDC)来获取ASM输出?我不愿意.DMD由创始人自己创建,我敢肯定他正确地实现了大部分功能/大部分优化.

那么,我该如何看一看ASM代码呢?

谢谢.

compiler-construction d dmd

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

如何按日期过滤numpy.ndarray?

我有一个2d numpy.array,其中第一列包含datetime.datetime对象,第二列包含第二列:

A = array([[2002-03-14 19:57:38, 197],
       [2002-03-17 16:31:33, 237],
       [2002-03-17 16:47:18, 238],
       [2002-03-17 18:29:31, 239],
       [2002-03-17 20:10:11, 240],
       [2002-03-18 16:18:08, 252],
       [2002-03-23 23:44:38, 327],
       [2002-03-24 09:52:26, 334],
       [2002-03-25 16:04:21, 352],
       [2002-03-25 18:53:48, 353]], dtype=object)
Run Code Online (Sandbox Code Playgroud)

我想要做的是选择特定日期的所有行,例如

A[first_column.date()==datetime.date(2002,3,17)]
array([[2002-03-17 16:31:33, 237],
           [2002-03-17 16:47:18, 238],
           [2002-03-17 18:29:31, 239],
           [2002-03-17 20:10:11, 240]], dtype=object)
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

谢谢你的见解:)

python datetime numpy scipy

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

C结构数组

我有一个C(不是C++)结构,就像这样

typedef struct mystruct{
float a,b;
int x, y;
} mystruct;
Run Code Online (Sandbox Code Playgroud)

然后在函数中我收集这样的数据:

mystruct List[MAX];
ListNumber = 0;

for(i = 0; i < MAX; i++)
{
 if(conditions_meet)
 {
  List[ListNumber].a = masterlist[i].a;
Run Code Online (Sandbox Code Playgroud)

...等等

ListNumber++;
 }
}
Run Code Online (Sandbox Code Playgroud)

然后我将数组发送到一个函数

 DoStuff(static int max, mystruct array[max]){
  Stuff
 }
Run Code Online (Sandbox Code Playgroud)

这有效,但当我尝试这样做时......

mystruct setter(int i)
{
mystruct TEMP;
TEMP.a = masterlist[i].a;
 //......etc
return TEMP;
}


mystruct List[MAX];
ListNumber = 0;

for(i = 0; i < MAX; i++)
{
 if(conditions_meet)
 {
  List[ListNumber] = setter(i);
  ListNumber++;
 }
}
Run Code Online (Sandbox Code Playgroud)

它会导致很多时髦的错误.为什么会这样?编辑:@ tommieb75我不能给出太多细节,结果似乎没有一个模式.该列表用作将内容绘制到屏幕的通用方法,并且具有函数而不是直接设置会在渲染中产生奇怪的问题 - …

c arrays pointers

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

指针问题

我是linux c编程的新手,我有一个简单的程序只是为了学习,当我编译它时,它给我错误"解除指向不完整类型的指针"这里是我的代码

struct Node
{
    struct Node* left;
    struct Node* middle;
    struct Node* right;
    int nodeData;
    int nodeLevel;
    char isVisted;
};
struct ListNode
{
    struct Node* data;
    struct ListNode* next;
};

struct List
{
    struct NodeList* head;
    struct NodeList* tail;
    int count;
};

typedef struct ListNode ListNode;
typedef struct Node Node;
typedef struct List List;

ListNode* InitListNode(Node* data)
{
    ListNode* listNode=(ListNode*)calloc(1,sizeof(ListNode));
    listNode->data=data;
    listNode->next=NULL;
    return listNode;
}

List* InitList()
{
    List* list=(List*)calloc(1,sizeof(List));
    list->count=0;
    list->head=list->tail=NULL;
}

void EnQue(Node* data,List* que)
{
    if(que->count==0) …
Run Code Online (Sandbox Code Playgroud)

c linux

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

C++奇怪的钻石继承问题

我有这个

    A
  /   \
 B     C
  \   /
    D
Run Code Online (Sandbox Code Playgroud)

A具有纯虚函数,原型如下:

virtual A* clone(void) const = 0;
Run Code Online (Sandbox Code Playgroud)

B和C几乎继承自A(class B: public virtual A,class C: public virtual A)

B具有虚函数,原型为:

virtual B* clone(void) const {}; 
Run Code Online (Sandbox Code Playgroud)

C具有虚函数,原型为:

virtual C* clone(void) const {};
Run Code Online (Sandbox Code Playgroud)

D继承了B&C,如:class D: public B, public C D具有虚函数,原型为:

virtual D* clone(void) const {};
Run Code Online (Sandbox Code Playgroud)

现在,在编译时我得到以下6行错误:

error C2250: 'D' : ambiguous inheritance of 'B *A::clone(void) const'
Run Code Online (Sandbox Code Playgroud)

毫无疑问如何解决这个问题.

提前致谢.

c++ inheritance visual-c++ diamond-problem

3
推荐指数
2
解决办法
848
查看次数

什么算作翻牌?

假设我有一个伪程序的C程序:

For i=0 to 10
    x++
    a=2+x*5
next
Run Code Online (Sandbox Code Playgroud)

对于30 FLOPS,这个(1 [x ++] + 1 [x*5] + 1 [2+(x + 5))]*10 [循环]的FLOP数量是多少?我无法理解翻牌是什么.

请注意[...]表示我从中获取"操作"的计数.

architecture flops

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

在Windows中更改控制台字体

有没有办法在python 2.6中更改Windows中的控制台字体?

我在Windows 7上.

即:

import os
os.console.font = 'Lucida Console'
Run Code Online (Sandbox Code Playgroud)

*编辑 (意外发布此答案)

更多信息和问题:

我查看了Windows API:http: //msdn.microsoft.com/en-us/library/ms682073%28v=VS.85%29.aspx

看起来它具有更改控制台字体的功能:

SetCurrentConsoleFontEx
Run Code Online (Sandbox Code Playgroud)

或者至少获取有关当前字体的信息:

GetCurrentConsoleFont
GetCurrentConsoleFontEx
Run Code Online (Sandbox Code Playgroud)

我的下一步是找到一个可以使用windows API的python模块.这是一个名为pywin32:http: //sourceforge.net/projects/pywin32/

你导入的实际模块不是pywin32,而是win32api,win32net,win32console我通过完全的猜测来解决这个问题.文档在哪里?帮助运行('win32console')

没有在那里显示所提到的字体功能,它只是简单地遗漏了它们.我在这里错过了什么吗?文档在哪里?或者哪个模块具有所有API的控制台功能......?

python windows

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