小编Abh*_*hav的帖子

效率:数组与指针

通过指针进行内存访问比通过数组进行内存访问更有效.我正在学习C,上面的内容在K&R中有说明.他们特别说

通过数组下标可以实现的任何操作也可以使用指针来完成.指针版本通常会更快

我使用visual C++解组了以下代码.(我是一个686处理器.我已禁用所有优化.)

int a[10], *p = a, temp;

void foo()
{
    temp = a[0];
    temp = *p;
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,我看到通过指针的内存访问需要通过数组对内存访问所采用的两条指令.以下是相应的代码.

; 5    : temp = a[0];

    mov eax, DWORD PTR _a
    mov DWORD PTR _temp, eax

; 6    : temp = *p;

    mov eax, DWORD PTR _p
    mov ecx, DWORD PTR [eax]
    mov DWORD PTR _temp, ecx
Run Code Online (Sandbox Code Playgroud)

请帮我理解.我在这里失踪了什么?


正如许多答案和评论所指出的那样,我使用了编译时常量作为数组索引,从而使得通过数组访问变得更容易.下面是汇编代码,其中变量作为索引.我现在有相同数量的指令通过指针和数组进行访问.我更广泛的问题仍然很好.通过指针进行内存访问并不会使其本身更有效.

; 7    :        temp = a[i];

    mov eax, DWORD PTR _i
    mov ecx, DWORD PTR _a[eax*4]
    mov DWORD PTR _temp, …
Run Code Online (Sandbox Code Playgroud)

c arrays performance pointers memory-access

57
推荐指数
6
解决办法
4万
查看次数

Android:嵌套片段的父片段

getParentFragment()来自我的嵌套片段的A 返回一个null.我意识到获得一个null意味着片段附加到活动而不是嵌套容器片段.但我明确地使用孩子将子片段嵌套在父片段中FragmentManager,因此认为我不应该得到一个null.你能告诉我我错过了什么吗?

父片段

public class UsageBreakUp extends Fragment implements Filter.OnFragmentInteractionListener {

  ....

  @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        getChildFragmentManager().beginTransaction().add(R.id.filter, new Filter()).commit();
    }

...

}
Run Code Online (Sandbox Code Playgroud)

儿童片段

public class Filter extends Fragment {

...


    public Filter() {
        if (getParentFragment() == null)
            Log.d(LOG_TAG, "parent fragment is null");
    }

...

}
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-nested-fragment

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

非回文的上下文无关语法

我需要一个CFG,它会生成除了回文之外的字符串.已提供解决方案,如下所示.(计算理论导论 - Sipser)

R -> XRX | S
S -> aTb | bTa
T -> XTX | X | <epsilon>
X -> a | b
Run Code Online (Sandbox Code Playgroud)

我对这个语法的工作方式有了一般的了解.它要求插入一个子串,该子串在其两半上通过生产具有相应的不相等的字母S -> aTb | bTa,从而确保永远不会产生回文.

我将按照我的理解写下前两部作品的语义,

  • S 生成不能成为回文的字符串,因为它们的第一个和最后一个字母不相等
  • R由至少一个S作为子串组成,确保它永远不是回文.

我不完全理解第三个产品的语义,即.

   T -> XTX | X | <epsilon>
   X -> a | b
Run Code Online (Sandbox Code Playgroud)

我看到它的方式,T可以生成a和b的任意组合,即{a,b}*.为什么它不会像

T -> XT | <epsilon>
X -> a | b
Run Code Online (Sandbox Code Playgroud)

这不是两个相同的?由于后者更直观,为什么不使用它?

context-free-grammar computation-theory

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

C中char类型的负值的重要性

  1. 'C'中的字符用于表示字符.
  2. 代表所有代码页中字符的数字总是正数.

签名字符有什么用?字符中包含的负值仅用作较小的整数数据类型中的整数值而不是int和short?他们没有其他解释吗?(像表示字符的字符中的正值)

c character chars

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

在准备队列只有一个进程且使用循环调度的系统中是否发生了上下文切换?

在准备队列只有一个进程且使用循环调度的系统中是否发生了上下文切换?

假设单个进程的当前cpu突发跨越循环算法的多于一个时间片.

我的推理如下

在典型情况下发生定时器中断时可能发生的步骤是

  1. 发生中断.切换到内核模式
  2. OS将当前上下文保存到PCB中(保存寄存器,当前进程的进程状态和内存管理信息)
  3. 执行许多特定于体系结构的操作,包括刷新数据和指令缓存以及TLB.
  4. 将当前进程放入就绪队列
  5. 选择要执行的新流程
  6. 从该过程的PCB加载上下文
  7. 切换到用户模式.开始执行新进程

我现在认为操作系统可能首先检查就绪队列并检查是否有其他进程.如果没有,则不需要上下文切换.因此,定时器中断的处理将需要在用户模式和内核模式之间切换,检查就绪Q,并切换回用户模式以继续执行该过程.

这是怎么回事?或者是否进行了适当的上下文切换,包括不必要地保存单个进程的当前状态并恢复相同的进程?

如果后来确实发生了,有特殊原因吗?

这种混淆是由于试卷中有关计算在这种情况下上下文切换所花费的时间的问题.给出的答案意味着确实发生了上下文切换.

我希望看过内核代码的人能够通过这个来解决这个问题.因此这个问题在stackoverflow上.

operating-system scheduling round-robin

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

oracle数据库中update-set-clause中表达式的计算顺序

在表格中,我有A列和B列.我想使用B的值更新A,然后将B更新为新值.这必须以原子方式完成.

我正在尝试这样的事情

-- Intially A = 1, B = 2
UPDATE T SET A = B, B = 10 WHERE ID = 1;
-- Now A = 2, B = 10
Run Code Online (Sandbox Code Playgroud)

虽然这是有效的,但是我无法找到保证我首先评估A = B并且稍后评估B = 10的文档.

我查看了update语句oracle sql参考

sql oracle

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

cxf : can't find request url for Observer

I am using spring with Apache CXF to create some rest resources. Looks like my jaxrs beans are not getting intialized.

WARNING: Can't find the the request for http://localhost:8080/cxf-sandbox/home-screen/v1/12345/predefined-templates/universal_template's Observer

What am I missing here?

I've configured for all requests to be routed to my CXF servlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">

<display-name>cxf-sandbox</display-name>

<context-param>
    <param-name>log4j.refresh.interval</param-name>
    <param-value>120</param-value>
</context-param>
<servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>


<context-param>
    <description>locations of the Spring configuration files</description>
    <param-name>contextConfigLocation</param-name>
    <param-value> …
Run Code Online (Sandbox Code Playgroud)

java rest spring cxf jax-rs

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

git cherry 采摘到不同的基本目录

我在分支 10.57 中有某些提交,我想将其合并到另一个分支 10.58。

我通常会在 10.57 到 10.58 之间挑选那些提交。

然而有一个小故障。某些文件在 10.58 中更改了它们的目录结构。

示例MAAS/ios-web-services10.57 中的源目录已移至MAAS/apple/ios-web-services10.58。

如果我像以前一样挑选,我的更改将重新创建为新文件/目录,MAAS/ios-web-services而不是合并到MAAS/apple/ios-web-services.

有没有办法让 git 将目录结构的这种变化考虑在内?

从目录 A 到目录 B 的 Git 樱桃选择文件似乎建议编辑补丁并手动应用它们。没有其他更简单的方法吗?

git git-merge git-cherry-pick

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

同步对Immutable Integer对象的访问

代码段 - 1

class RequestObject implements Runnable
{
    private static Integer nRequests = 0;

    @Override
    public void run()
    {       
        synchronized (nRequests)
        {
            nRequests++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

代码段 - 2

class RequestObject implements Runnable
{
    private static Integer nRequests = 0;
    private static Object lock = new Object();

    @Override
    public void run()
    {       
        synchronized (lock)
        {
            nRequests++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然第二个代码片段工作正常而没有引起任何竞争条件,但第一个代码片段不能成功同步对同一个类的不同实例(RequestObject)之间的静态数据成员的访问.有人可以对此有所了解吗?我想了解为什么第一种方法不起作用.

我最初的实现是第一个.后来我在/sf/answers/148428661/中看到了.

java multithreading synchronization

5
推荐指数
2
解决办法
432
查看次数

不可变对象的同步(在java中)

代码段 - 1

class RequestObject implements Runnable
{
    private static Integer nRequests = 0;

    @Override
    public void run()
    {       
        synchronized (nRequests)
        {
            nRequests++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

代码段 - 2

public class Racer implements Runnable
{
    public static Boolean won = false;    

    @Override
    public void run()
    {
        synchronized (won)
        {
            if (!won)
            won = true;
        }
    }        
}
Run Code Online (Sandbox Code Playgroud)

我在第一个代码片段中遇到了竞争条件.我明白这是因为我在一个不可变对象(Integer类型)上获得了一个锁.

我写了第二个代码片段,它再次不受'布尔'不可变的影响.但是这样可行(输出运行中不显示竞争条件).如果我已正确理解上一个问题的解决方案,则以下是一种可能出错的方法

  1. 线程1获取对象(例如A)所指向的锁定 won
  2. 线程2现在试图锁定指向的对象won并进入A的等待队列
  3. 线程1进入同步块,验证A是假并通过说won = true(A认为它赢得了比赛)创建一个新对象(比如说B ).
  4. 'won'现在指向B.线程1释放对象A上的锁(不再指向won)
  5. 现在,在对象A的等待队列中的线程2被唤醒并获得对象A的锁定,这仍然是false(不可变的).它现在进入同步块并假设它也赢了,这是不正确的. …

java multithreading synchronization

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