好的,我的代码类型调用赋值运算符。我在Code :: Blocks中尝试过这段代码,效果很好。然而,在Rowley的Crossworks中,它无法工作。两个IDE都使用GCC编译器。这是我的哑课:
template <typename T>
class Iterator {
public:
Iterator() { ptr = nullptr; }
Iterator(const T* p) : ptr(p) {}
virtual ~Iterator() {}
// Other stuff
protected:
const T* ptr;
};
这是我违规的代码:
void GetStuff()
{
static Iterator<char> it;
static char buf[4];
// Place the data into buf
it = buf; /* NOTHING HAPPENS. Indeed no assembly is generated for this line. */
Send(it, sizeof(buf)); // Where Send() accepts a pointer to an Iterator<char>
}
赋值应该设置Iterator类指向&buf[0]
的指针,我假设这是默认赋值运算符使用Iterator(const T* p)
重载应该做的事情(至少我认为&#39;应该怎么做。)
为什么不调用默认赋值运算符?为什么根本不生成代码?
编辑:清晰度
答案 0 :(得分:0)
由于未使用,编译器可能会优化或删除任何内容。如果定义自己的赋值运算符,则编译器无法对其语义进行假设。尝试输入cout
或其他东西,这将导致打印。
Iterator& operator=(Iterator rhs) {
std::cout << "actually assigning\n";
this->ptr = rhs.ptr;
return *this;
}
但是你不需要这样做,因为编译器会为你生成更好的代码,无论如何都允许更多的优化(正如你已经发现的那样)
答案 1 :(得分:0)
为了详细说明一些评论,编译器会积极地删除那些没有完成任何事情的语句。其他人已注意到在调试中编译,但即使关闭优化,有时也会发生死代码消除。 (另外,有时它是您想要看到的优化组件 - 当我试图分析小片段时,我会遇到这种情况。)
我有时会使用像这样的小功能,它具有防止被优化的所有保护。只需致电func(it)
:
template<typename T>
__attribute__((noinline))
void func(volatile const T)
{
asm ("");
}
这个函数读取:接受任何参数,不做任何操作,不内联此函数,并且它有一个正文,所以不要认为你可以安全地跳过它。但由于参数变量现在已被“使用”,因此它不会被优化掉。
或者可以只是在不同文件中的任何内容,因为您需要启用链接时优化,以便编译器在此时剔除它。
答案 2 :(得分:0)
希望有人能够在某个地方看到并且没有陷入同一个陷阱。问题不在于使用Crossworks工作方式的C ++代码。
我已将代码组织到目录中的src
和inc
文件夹中。在Crossworks中,我创建了&#34;动态文件夹&#34;据说扫描目录和子目录并更新项目视图。此外,此重新扫描不是自动的。所以这是我的问题:
src
和inc
文件夹中。 Crossworks将这些文件显示为位于根目录中。.c
和.h
个文件&#39;编辑器。Remove
.c
和.h
。在步骤1中创建的.c
和.h
文件应显示在正确的文件夹中。.c
和.h
文件进行更改。 Crossworks在某种程度上没有对正确的文件进行更改,因为它仍然认为它们位于根中,即使它们是在子目录中创建的,也是为了开始。 这是我对Crossworks正在做的最好的猜测。我以前一直被这个问题所困扰,并花了好几分钟来解释为什么我的代码没有编译。解决方案是关闭文件,重新扫描动态文件夹,然后再从动态文件夹中打开文件。我希望这会有所帮助。
答案 3 :(得分:-1)
您没有定义赋值运算符。尝试类似:
Iterator & operator = ( const T * p ) { ptr = p; return *this; }