4

这是用于读取高速缓存内存模拟的主内存地址跟踪的 C++ 代码:

 char hex[20];
 ifstream infile;
 infile.open(filename,ios::in);
 if(!infile) {
    cout<<"Error! File not found...";
    exit(0);
 }
 int set, tag, found;
 while(!infile.eof()) { //Reading each address from trace file
      if(base!=10) {
           infile>>hex;
           address = changebase(hex, base);
      } else {
           infile>>address;
      }
      set = (address / block_size) % no_set;
      tag  = address / (block_size * no_set);
 }

我已将其转换为 C# 代码:

 char[] hex = new char[20];
 FileStream infile=new FileStream(filename, FileMode.Open);

 if (infile == null) {
     Console.Write("Error! File not found...");
     Environment.Exit(0);
 }
 int set;
 int tag;
 int found;
 while (!infile.CanRead) { //Reading each address from trace file
     if (@base != 10) {
         infile >> hex;
         address = changebase(hex, @base);
     } else {
         infile >> address;
     }
     set = (address / block_size) % no_set;
     tag = address / (block_size * no_set);
 }

问题在于infile >> hex; C# 行给出了语法错误,因为右移运算符不能应用于字符串运算符。

为什么这不起作用?我正在做一个小的缓存命中和未命中计算项目。

4

2 回答 2

12

量化 Eric 的含义:

C++ 在可重载的运算符方面非常灵活。<<移位运算符也>>用于输入和输出已成为一种“成语” 。这实际上是有道理的,因为它是一个逻辑结构,并且眼睛记录了对象之间的某种“流动”。

在 C# 中,您不会重载这些运算符。Eric 的意思是,你需要明确地说,在流对象上,写(或者实际上,读)一些东西。这意味着直接调用方法。

从本质上讲,您正在做同样的事情-运算符重载只是一个不错的快捷方式,但是最终将调用某些方法-无论是漂亮的装饰性“运算符重载”还是简单的旧函数调用一个名字。

因此,在 C++ 中,我们可能会这样写:

std::cout << "Hello" << std::endl;

而在 C# 中,我们会写:

Console.WriteLine("Hello");

std::cout如果我们忽略可能与控制台窗口不同的事实(这是说明性的),则概念完全相同。

为了扩展运算符的概念,您可能还会遇到诸如stringstream.. 之类的东西,它的作用类似于字符串的流。它真的很有用:

std::stringstream ss;
int age = 25;
ss << "So you must be " << age << " years old.";

在 C# 中,我们通过类实现了这一点StringBuilder

StringBuilder sb = new StringBuilder();
int age = 25;
sb.Append("So you must be ").Append(age).Append(" years old");

他们都做同样的事情。我们还可以这样做:

sb.AppendFormat("So you must be {0} years old", age);

这更类似于(在我看来)更类似于 C 的sprintf方法,或者最近,boost 的格式库

于 2013-04-28T20:38:34.620 回答
9

C# 不使用奇怪的 C++ 约定,即位移也意味着流操作。您必须实际调用 I/O 方法。

于 2013-04-28T20:09:47.370 回答