1

<C++ primer (3rd)>以下是Stanley B. Lippman Josée Lajoie的第 7.6 章的摘录。

指定为 inline 的函数在调用它的程序中的每个点都“行内”展开。例如,

int minVal2 = min( i, j );

在编译期间扩展为

int minVal2 = i < j ? 我:j;

因此消除了使 min() 成为函数的运行时开销。min() 通过在函数声明或定义中函数的返回类型之前指定 inline 关键字来声明内联:

内联 int min( int v1, int v2 ) { /* ... */ }

但是请注意,内联规范只是对编译器的建议。编译器可能会选择忽略此建议,因为声明为 inline 的函数不是在调用点进行扩展的良好候选者。递归函数,例如 rgcd(),不能在调用点完全展开(尽管它的第一次调用可以)。一个 1,200 行的功能也很可能不会在调用点进行扩展。通常,内联机制旨在优化小型、直线、经常调用的函数。在抽象数据类型的设计中支持信息隐藏是最重要的, 例如 2.3 节介绍的 IntArray 类及其 size() 内联成员函数。

有人可以解释标记为粗体的句子吗?

4

3 回答 3

1
  • “在抽象数据类型设计中,对信息隐藏的支持起到了重要作用”

数据类型:您可能对这个术语很熟悉。它可以是整数、字符串等,也可以是更复杂的类型,如 B-Tree、复数等。

抽象数据类型:这些是代表一些现实生活对象的数据类型。

例如

struct SCustomer
{
   string name;
   string address;
   int    id;
   enum CreditRanking { Good, Poor, Bankrupt };
   CreditRating rating;
};

CreditRating是一种抽象数据类型,SCustomer也是如此。

信息隐藏:通过将信息封装在抽象数据类型中,设计人员可以考虑对客户/与客户执行的操作,而 SCustomer 的实际实现不会混淆他们的思维过程。

信息并没有真正隐藏,如果他们愿意,他们可以查看数据类型的定义,但在许多情况下,只关注高级(抽象)而不考虑小细节会更容易。

你可以这样想:

  • 考虑底层细节并构建一组对象。
  • 忽略底层细节并将对象组合成更大的对象或应用程序。

上面的内容有点过于简单了,但我希望它能给你带来味道。

这有帮助吗?

于 2012-11-07T09:45:28.013 回答
1

我这里没有第三版的全文,但从你发布的上下文来看,他在说什么很清楚。

想象一种“向量”类。

class Vector {
private: 
  int * data; // pointer to data

有几种方法可以提供对向量大小的访问:

选择 1:公共成员变量:

public:
  int datasize; 

选择 2:带有公共访问器的私有变量

private:
  int datasize; 

public:
  int getSize(); // body can be hidden in CPP, but would be { return datasize;};

选择 3:同 2,但使用内联访问器

private:
  int datasize; 

public:
  inline int getSize() { return datasize; };

现在,#1 的数据隐藏很差,但性能很好。#2 有很好的数据隐藏,但性能很差。#3 具有良好的数据隐藏能力,并且可能具有出色的性能。(记住 inline 只是一个提示)

在我看来,#3 的数据隐藏略逊于#2,因为功能代码显示在标题中 - 即使您无法访问该成员。所以,我会重写他的陈述...

内联函数在数据隐藏与性能要求之间提供了很好的折衷。

我不同意它是“最重要的”,因为它只是对编译器的提示。

于 2012-11-07T16:56:22.297 回答
0

关于“内联函数”的出现较晚。

调用内联函数与将代码“对齐”一样快。由于速度和大小的开销,一些程序员可能会犹豫将他们的逻辑封装在函数中,但是使用内联函数可以将任何开销最小化到(通常)微不足道的数量。

想想这段代码:

int customer_code = get_code(customer_name);
int product_code  = get_id(product_name);
bool credit_ok    = check_credit(customer_code);
int order_number  = create_order(customer_code, credit_ok, 
                                 product_code, quantity);
print_order(order_number, customer_code, customer_name, 
            product_code, product_name, quantity);

信息隐藏版本可能如下所示。

order ord = cust.make_order(product, quantity);
order.print();

这构成了更大程序的一部分,您可以使高级代码更容易理解。仍然有人需要设计客户、订单、产品等对象,但他们只需要一次专注于一件事,然后这些对象就可以在整个程序中使用。

于 2012-11-07T10:09:00.680 回答